14

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

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

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

例子:

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

1 回答 1

26

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

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

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

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

如果日期范围大,则为全扫描;如果日期范围小,则为索引扫描。

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

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

于 2011-01-28T17:21:36.537 回答