Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Timeout della query di SQL Server in base alla clausola Where

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:

  1. Usa l'SQL dinamico (ma leggi prima questo:La maledizione e le benedizioni dell'SQL dinamico)

  2. Usa OPTIMIZE FOR

  3. Usa WITH(RECOMPILE)