Поделиться через


Перекомпиляция хранимых процедур

После изменения базы данных из-за добавления индексов или изменения данных в индексируемых столбцах нужно заново выполнить оптимизацию исходных планов запросов, использовавшихся для доступа к таблицам, с помощью перекомпиляции. Оптимизация проводится автоматически во время первого выполнения хранимой процедуры после перезапуска MicrosoftSQL Server. Она также проводится при изменении базовой таблицы, используемой хранимой процедурой. Но если добавляется индекс, предоставляющий хранимой процедуре преимущества, оптимизация не проводится до следующего выполнения этой процедуры после перезапуска SQL Server. В этой ситуации будет полезно выполнить принудительную перекомпиляцию при следующем запуске хранимой процедуры.

Другая причина для принудительного перекомпилирования хранимой процедуры — это нейтрализации, если это необходимо, пробного сохранения параметров при компиляции процедуры. Когда SQL Server выполняет хранимые процедуры, значения всех используемых ими параметров при компиляции включаются как часть формируемого плана запроса. Если эти значения типичны для последующих вызовов процедуры, компиляция и выполнение хранимой процедуры с этим планом запроса происходит быстрее. Иначе производительность может снизиться.

ПримечаниеПримечание

SQL Server 2008 обладает возможностью перекомпиляции хранимых процедур на уровне инструкций. Во время перекомпиляции хранимой процедуры SQL Server 2008 заново компилирует только вызвавшую этот процесс инструкцию, а не всю процедуру. В результате при формировании нового плана запроса SQL Server будет использовать значения параметров, присутствующих в перекомпилированной инструкции. Эти значения могут отличаться от первоначально переданных в процедуру значений.

Принудительная перекомпиляция хранимой процедуры

SQL Server предоставляет три способа вызвать принудительную перекомпиляцию хранимой процедуры:

  • Выполнение системной хранимой процедуры sp_recompile приводит к перекомпиляции хранимой процедуры при следующем ее запуске. Для этого из кэша процедур удаляется существующий план, в результате чего при следующем запуске процедуры создается новый план.

  • Создание хранимой процедуры с параметром WITH RECOMPILE в определении указывает, что SQL Server не будет кэшировать план этой процедуры; хранимая процедура будет перекомпилироваться при каждом запуске. Параметр WITH RECOMPILE полезен, если хранимая процедура принимает параметры, чьи значения сильно меняются между ее выполнениями, что приводит к созданию новых планов выполнения каждый раз. Этот параметр используется редко и замедляет выполнение хранимых процедур, так как они должны перекомпилироваться при каждом своем запуске.

    Если нужно перекомпилировать отдельные запросы, а не всю хранимую процедуру, укажите подсказку RECOMPILE внутри каждого запроса, нуждающегося в перекомпиляции. Этот режим похож на режим SQL Server перекомпиляции на уровне инструкций, упоминавшийся выше, но при компиляции инструкций в подсказке RECOMPILE кроме текущих значений параметров процедуры также используются значения локальных переменных внутри хранимой процедуры. Используйте этот параметр, если нетипичные или временные значения встречаются только в части запросов, входящих в хранимую процедуру. Дополнительные сведения см. в разделе Подсказки в запросах (Transact-SQL).

  • Принудительно перекомпилировать хранимую процедуру можно, задав параметр WITH RECOMPILE при ее выполнении. Используйте этот параметр, только если предоставляемые параметры нетипичны или если с момента создания хранимой процедуры данные изменились существенно.

    ПримечаниеПримечание

    Если объект, на который ссылается хранимая процедура, удален или переименован, при выполнении этой процедуры произойдет ошибка. Однако, если объект, на который ссылается хранимая процедура, заменен на объект с тем же именем, хранимую процедуру можно выполнять, не обновляя ее.

Перекомпиляция хранимой процедуры при следующем ее выполнении