SQL Server: эффекты использования "WITH RECOMPILE" в определении proc?

Мое понимание опции WITH RECOMPILE с хранимыми процедурами обычно ограничено использованием предложения с одним сохраненным вызовом proc в качестве трейлинг-параметра:

exec sp_mystoredproc 'Parameter1', 2, '1/28/2011' with recompile

Каковы последствия включения WITH RECOMPILE в фактическое определение proc? Это перекомпилирует proc каждый раз, когда он выполняется? Или просто в следующий раз, когда proc будет изменен?

Пример:

CREATE PROCEDURE [dbo].[sp_mystoredproc]
    (@string1           varchar(8000)
    ,@int2              int = 2
    ,@dt_begin          DATETIME
    with recompile
AS
... proc code ...

Ответы

Ответ 1

Это заставляет proc восстанавливать планы всех запросов каждый раз, когда он запускается.

Полезно, что значения параметров proc влияют на селективность фильтра.

Скажем, оптимальный план для этого запроса:

SELECT  *
FROM    orders
WHERE   order_date BETWEEN @begin_report AND @from_report

будет полным сканированием, если диапазон дат большой или сканирование индекса, если оно мало.

Созданный с использованием WITH RECOMPILE, proc будет строить план при каждом выполнении; без него он будет придерживаться единого плана (но сэкономит время на самой перекомпиляции).

Этот совет обычно используется в обработке обработок больших объемов данных и выполнении сложных отчетов, когда общее время запроса велико, и время для восстановления плана незначительно по сравнению с временем, сохраненным лучшим планом.