Существует несколько способов обеспечить перекомпиляцию хранимой процедуры:
- с использованием
WITH RECOMPILE
,
- делает хранимую процедуру динамической (представьте
exec()
)
- маркировка proc для перекомпиляции с
sp_recompile
.
- изменение схемы, на которую опирается кэшированный план запросов
- звонит
DBCC FREEPROCCACHE
- На уровне запроса отдельный оператор в процедуре может быть перекомпилирован с подсказкой запроса RECOMPILE (SQL 2008).
Факторы при перекомпиляции
Помимо перечисленных выше жестких факторов, что вызывает перекомпиляцию хранимой процедуры? Ну, много чего. Некоторые из них переплетаются с приведенным выше списком, но я хочу представить их еще раз, поскольку это может быть неочевидно.
- Вставка или удаление большого количества данных (плотность данных в индексах и таблицах часто контролирует планы запросов)
- Восстановление индексов (изменение базовых объектов)
- Создание / удаление временных таблиц (опять же, базовые изменения DML).
- План запросов устарел (подумайте, что он не использовался в последнее время, а sql хочет очистить использование памяти)
Это далеко не полный список. Оптимизатор запросов развивается и удивляется независимо от того, как долго вы используете SQL Server. Но вот некоторые ресурсы, которые могут быть полезны:
НО ЖДИТЕ - БОЛЬШЕ!
С учетом вышесказанного в вашем вопросе предполагается, что перекомпиляция всегда ухудшает производительность. На самом деле, часто перекомпиляция это хорошо.
Так когда бы вы захотели перекомпилировать? Давайте посмотрим на один пример процесса, который ищет по фамилии. Хранимые процедуры выполняют ' параметр сниффинг ', что является благословением (если оно работает для вас) и проклятием (если оно работает против вас). Первый проход кто-то ищет на Zebr%
для Зербровского. Индекс фамилии понимает, что это очень специфично и вернет, скажем, 3 строки из миллиона - так строится один план выполнения. С процедурой, скомпилированной для низкого результата строки, следующий поиск для S%
. Ну, S - ваше самое распространенное имя и соответствует 93 543 строкам из 1 миллиона.