Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Timeout für SQL Server-Abfrage abhängig von Where-Klausel

Das Problem, das Sie erleben, ist (fast sicher) auf einen zwischengespeicherten Abfrageplan zurückzuführen, der für einige Versionen von Parametern geeignet ist, die an die Abfrage übergeben werden, aber nicht für andere (auch bekannt als Parameter Sniffing).

Dies kommt häufig vor und wird oft durch veraltete Statistiken und/oder stark fragmentierte Indizes verschlimmert.

Erster Schritt :Stellen Sie sicher, dass Sie alle Ihre Indizes neu erstellt haben und dass die Statistiken zu nicht indizierten Spalten auf dem neuesten Stand sind. (Stellen Sie außerdem sicher, dass Ihr Client einen regelmäßig geplanten Indexwartungsauftrag hat)

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

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

Dies ist die kanonische Referenz:Slow in the Application, Fast in SSMS?

Wenn das Problem nach dem Neuaufbau der Indizes und dem Aktualisieren der Statistiken weiterhin besteht, haben Sie einige Möglichkeiten:

  1. Verwenden Sie dynamisches SQL (aber lesen Sie zuerst:Fluch und Segen von dynamischem SQL)

  2. Verwenden Sie OPTIMIZE FOR

  3. Verwenden Sie WITH(RECOMPILE)