Это очень вероятно из-за «перехвата параметров» и кэшированного плана запроса, который не подходит для определенных значений параметров, с которыми вы его вызываете. Как это происходит? Что ж, при первом вызове SP с одним набором значений будет сгенерирован, параметризован и кэширован план запроса. Если SP вызывается снова с другим набором значений параметров, которые привели бы к другому плану запроса, но он использует кэшированный план запроса, производительность может снизиться.
Это часто потому, что статистика устарела. Вы можете определить, так ли это, сравнив Оценочный план выполнения с Фактическим планом выполнения; если отличается, то статистика, скорее всего, устарела.
Сначала я бы попытался перестроить индексы базы данных или, по крайней мере, обновить ее статистику (спросите своего администратора баз данных). Один из способов перестроить индексы (должен работать на всех версиях на SQL Server):
exec sp_msforeachtable "dbcc dbreindex ('?')"
Если проблема не устранена, попробуйте временно добавить оператор WITH RECOMPILE
в определение хранимой процедуры. Если проблема исчезнет, посмотрите на использование OPTIMIZE FOR
, описанное в этом сообщении в блоге.