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

SQL Server-forespørgsel timeout afhængigt af Where-klausul

Det problem, du oplever, skyldes (næsten helt sikkert) en cachelagret forespørgselsplan, som er passende for nogle versioner af parametre, der sendes til forespørgslen, men ikke for andre (alias Parameter Sniffing).

Dette er en almindelig hændelse og forværres ofte af forældede statistikker og/eller dårligt fragmenterede indekser.

Første trin :Sørg for, at du har genopbygget alle dine indekser, og at statistik over ikke-indekserede kolonner er opdateret. (Sørg også for, at din klient har et regelmæssigt planlagt indeksvedligeholdelsesjob)

exec sp_msforeachtable "DBCC DBREINDEX('?')"
go

exec sp_msforeachtable "UPDATE STATISTICS ? WITH FULLSCAN, COLUMNS"
go

Dette er den kanoniske reference:Langsom i applikationen, hurtig i SSMS?

Hvis problemet stadig eksisterer efter genopbygning af indekser og opdatering af statistik, så har du et par muligheder:

  1. Brug dynamisk SQL (men læs dette først:The Curse and Blessings ofDynamic SQL)

  2. Brug OPTIMIZE FOR

  3. Brug WITH(RECOMPILE)




  1. Sådan får du den bedste brug af kommentarfunktionen i MySQL

  2. SQL Server 2008-support slutter. Hvad nu?

  3. Psql kunne ikke oprette forbindelse til serveren:Ingen sådan fil eller mappe, 5432 fejl?

  4. Sådan opretter du en tabel i MySQL