Il problema che stai riscontrando è (quasi certamente) dovuto a un piano di query memorizzato nella cache, che è appropriato per alcune versioni dei parametri passati alla query, ma non per altre (aka Sniffing dei parametri).
Questo è un evento comune ed è spesso aggravato da statistiche non aggiornate e/o indici fortemente frammentati.
Primo passo :assicurati di aver ricostruito tutti i tuoi indici e che le statistiche sulle colonne non indicizzate siano aggiornate. (Inoltre, assicurati che il tuo cliente abbia un lavoro di manutenzione dell'indice regolarmente programmato)
exec sp_msforeachtable "DBCC DBREINDEX('?')"
go
exec sp_msforeachtable "UPDATE STATISTICS ? WITH FULLSCAN, COLUMNS"
go
Questo è il riferimento canonico:lento nell'applicazione, veloce in SSMS?
Se il problema persiste dopo aver ricostruito gli indici e aggiornato le statistiche, hai alcune opzioni:
-
Usa l'SQL dinamico (ma leggi prima questo:La maledizione e le benedizioni dell'SQL dinamico)
-
Usa
OPTIMIZE FOR
-
Usa
WITH(RECOMPILE)