Problém, se kterým se setkáváte, je (téměř jistě) způsoben plánem dotazů uloženým v mezipaměti, který je vhodný pro některé verze parametrů předávaných dotazu, ale ne pro jiné (také znám jako Parameter Sniffing).
To je běžný jev a často se zhoršuje zastaralými statistikami a/nebo špatně fragmentovanými indexy.
První krok :ujistěte se, že jste znovu vytvořili všechny své indexy a že statistiky neindexovaných sloupců jsou aktuální. (Také se ujistěte, že váš klient má pravidelně naplánovanou úlohu údržby indexu)
exec sp_msforeachtable "DBCC DBREINDEX('?')"
go
exec sp_msforeachtable "UPDATE STATISTICS ? WITH FULLSCAN, COLUMNS"
go
Toto je kanonický odkaz:Pomalý v aplikaci, rychlý v SSMS?
Pokud problém přetrvává i po opětovném sestavení indexů a aktualizaci statistik, máte několik možností:
-
Používejte dynamické SQL (ale nejprve si přečtěte toto:The Curse and Blessings of Dynamic SQL)
-
Použijte
OPTIMIZE FOR
-
Použijte
WITH(RECOMPILE)