Перекомпиляция хранимых процедур
После изменения базы данных из-за добавления индексов или изменения данных в индексируемых столбцах нужно заново выполнить оптимизацию исходных планов запросов, использовавшихся для доступа к таблицам, с помощью перекомпиляции. Оптимизация проводится автоматически во время первого выполнения хранимой процедуры после перезапуска SQL Server. Кроме того, она проводится и при изменении базовой таблицы, используемой хранимой процедурой. Но если добавляется новый индекс, предоставляющий хранимой процедуре преимущества, оптимизация не проводится до следующего выполнения этой процедуры после перезапуска SQL Server. В этой ситуации будет полезно выполнить принудительную перекомпиляцию при следующем запуске хранимой процедуры.
Другая причина для принудительного перекомпилирования хранимой процедуры — это нейтрализации, если это необходимо, пробного сохранения параметров при компиляции процедуры. Когда SQL Server выполняет хранимые процедуры, значения всех используемых ими параметров при компиляции включаются как часть формируемого плана запроса. Если эти значения типичны для последующих вызовов процедуры, то компиляция и выполнение хранимой процедуры с этим планом запроса происходит быстрее. Иначе производительность может снизиться.
SQL Server 2008 R2 обладает возможностью перекомпиляции хранимых процедур на уровне инструкций. Во время перекомпиляции хранимой процедуры SQL Server 2008 R2 заново компилирует только вызвавшую этот процесс инструкцию, а не всю процедуру. В результате при формировании нового плана запроса SQL Server будет использовать значения параметров, присутствующих в перекомпилированной инструкции. Эти значения могут отличаться от первоначально переданных в процедуру значений.
Принудительная перекомпиляция хранимой процедуры
SQL Server предоставляет три способа вызвать принудительную перекомпиляцию хранимой процедуры:
Выполнение системной хранимой процедуры sp_recompile приведет к перекомпиляции хранимой процедуры при следующем ее запуске. Для этого из кэша процедур удаляется существующий план, в результате чего при следующем запуске процедуры создается новый план.
Создание хранимой процедуры с параметром WITH RECOMPILE в определении указывает, что SQL Server не будет кэшировать план этой процедуры; хранимая процедура будет перекомпилироваться при каждом запуске. Параметр WITH RECOMPILE полезен в том случае, когда хранимая процедура принимает параметры, значения которых сильно меняются между выполнениями, что приводит к созданию каждый раз новых планов выполнения. Этот параметр используется редко и замедляет выполнение хранимых процедур, так как они должны перекомпилироваться при каждом запуске.
Если нужно перекомпилировать отдельные запросы, а не всю хранимую процедуру, то указывайте подсказку RECOMPILE внутри каждого запроса, нуждающегося в перекомпиляции. Точно таким же образом выполняется упоминавшаяся выше перекомпиляция на уровне инструкций SQL Server, но при компиляции инструкций в подсказке в запросе RECOMPILE, кроме текущих значений параметров процедуры, используются также значения локальных переменных внутри хранимой процедуры. Пользуйтесь этим параметром в том случае, если нетипичные или временные значения встречаются только в части запросов, входящих в хранимую процедуру. Дополнительные сведения см. в разделе Подсказки в запросах (Transact-SQL).
Принудительно перекомпилировать хранимую процедуру можно, задав параметр WITH RECOMPILE при ее выполнении. Используйте этот параметр, только если предоставляемые параметры нетипичны или если с момента создания хранимой процедуры данные изменились существенно.
Примечание Если объект, на который ссылается хранимая процедура, удален или переименован, при выполнении этой процедуры произойдет ошибка. Однако, если вместо данного объекта создать другой объект с тем же именем, хранимую процедуру можно выполнить, не меняя определение.
Перекомпиляция хранимой процедуры при следующем ее выполнении