SQL Server:在proc定义中使用'WITH RECOMPILE'的效果?

Dan*_*rza 14 t-sql sql-server stored-procedures recompile

我对WITH RECOMPILE存储过程选项的理解通常仅限于使用带有单个存储过程调用的子句作为尾随参数:

exec sp_mystoredproc 'Parameter1', 2, '1/28/2011' with recompile
Run Code Online (Sandbox Code Playgroud)

包含WITH RECOMPILE在实际proc定义中有什么影响?这会在每次执行时重新编译proc吗?或者只是下次更改过程?

例:

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

Qua*_*noi 26

这使得proc在每次运行时都会重建所有查询的计划.

有用的是,proc参数的值会影响过滤器的选择性.

比如说,这个查询的最佳计划:

SELECT  *
FROM    orders
WHERE   order_date BETWEEN @begin_report AND @from_report
Run Code Online (Sandbox Code Playgroud)

将是一个完整的扫描,如果日期范围较大索引扫描,如果是小的.

使用时WITH RECOMPILE,proc将在每次执行时构建计划; 没有一个,它将坚持一个计划(但会节省重新编译本身的时间).

当整体查询时间很长并且重建计划的时间与更好的计划所节省的时间相比可以忽略不计时,此提示通常用于处理大量数据和执行复杂报告的过程中.