SQL Server: эффекты использования "с перекомпиляцией" в определении 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 построит план на каждом выполнении; без одного он будет придерживаться одного плана (но будет экономия времени на самой перекомпиляции).

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