Некоторое время назад у меня был запрос, который я довольно часто выполнял для одного из моих пользователей. Он все еще развивался и настраивался, но в конечном итоге он стабилизировался и работал довольно быстро, поэтому мы создали из него хранимую процедуру.
Пока все нормально.
Однако хранимая процедура была медленной. Никакой существенной разницы между запросом и процедурой, но изменение скорости было огромным.
[Фон, мы работаем с SQL Server 2005.]
Дружелюбный местный администратор базы данных (который здесь больше не работает) взглянул на хранимую процедуру и сказал: «Подмена параметров!» (Изменить: хотя кажется, что это, возможно, также известно как «анализ параметров», что может объяснить малое количество обращений в Google, когда я пытался его найти.)
Мы абстрагировали часть хранимой процедуры во вторую, обернули вызов этой новой внутренней процедуры в уже существующую внешнюю, называемую внешней, и, привет, это было так же быстро, как и исходный запрос.
Итак, что дает? Может кто-нибудь объяснить подмену параметров?
Бонусный кредит на
- подчеркивая, как этого избежать
- предлагая, как распознать возможную причину
- обсудить альтернативные стратегии, например статистика, индексы, ключи, для смягчения ситуации