Проблемът, който изпитвате, се дължи (почти сигурно) на кеширан план за заявка, който е подходящ за някои версии на параметрите, предадени на заявката, но не и за други (известен още като Parameter Sniffing).
Това е често срещано явление и често се влошава от остарели статистически данни и/или лошо фрагментирани индекси.
Първа стъпка :уверете се, че сте възстановили всичките си индекси и че статистическите данни за неиндексирани колони са актуални. (Освен това се уверете, че вашият клиент има редовно планирана работа за поддръжка на индекс)
exec sp_msforeachtable "DBCC DBREINDEX('?')"
go
exec sp_msforeachtable "UPDATE STATISTICS ? WITH FULLSCAN, COLUMNS"
go
Това е каноничната справка:Бавно в приложението, Бързо в SSMS?
Ако проблемът все още съществува след възстановяване на индекси и актуализиране на статистиката, тогава имате няколко опции:
-
Използвайте динамичен SQL (но първо прочетете това:Проклятието и благословиите на динамичния SQL)
-
Използвайте
OPTIMIZE FOR
-
Използвайте
WITH(RECOMPILE)