3

I'm working on updated procedures that I inherited from someone who is no longer at the company.

I have found procedures that include WITH RECOMPILE option after the header. In the notes it says that it was added "to mitigate timeouts from blocking"

ALTER PROC ups_SomeProc (@pMyParameter INT) WITH RECOMPILE
AS
BEGIN

In all my experience I never heard of WITH RECOMPILE option helping with blocking or even be related to blocking in any way.

Am I missing some understanding about this option or the person who implemented it was the one who got confused on what it does? Have anyone heard of this before as a solution for blocking?

Note: This was done when server was still running SQL Sever 2008 edition.

4

2 回答 2

2

我可以想到一种可以提供帮助的方法(我自己亲身经历过)。每个存储过程都有一个缓存的查询计划。如果存储的执行方式基于某些值而变化很大,有时可能会出现问题,因为缓存的查询计划可能完全不合适。

假设您有一个看起来像的存储过程

create procedure SomeProc 
as
begin
    declare @value int

    select @value = somevalue from atable where date = getdate() -- getting different value every time

    if @value = 1 then -- do one thing
    if @value = 2 then -- do something different
    if @value = 3 then -- do something completely different
end

当值为 1 时,查询计划可能已被缓存。当您再次运行它并且该值现在为 2 或 3 时,信息不合适,可能导致查询执行需要很长时间。有时,您可以通过大量不同的读取等来发现此类查询。

当您使用WITH RECOMPILE时,它可以通过强制 SQL Server 提出新的执行计划来缓解这些问题。

于 2014-03-03T21:29:30.327 回答
2

OPTION WITH RECOMPILE即使内存中缓存了现有计划,也会强制 Sql Server 重新编译执行计划。

如果底层数据发生巨大且非常迅速的变化,则缓存的执行计划效率会降低。因此,在这种情况下,使用WITH RECOMPILE选项执行过程的速度比使用已经编译的执行计划时执行的速度要快得多。

我猜开发人员/人在执行存储过程时经历了一些长时间的延迟。当他使用该WITH RECOMPILE选项时,它执行得更快。所以也许他认为在没有重新编译选项的情况下执行这个过程会导致阻塞。:) 有趣的故事,但我认为这就是发生的事情。

于 2014-03-03T21:31:35.290 回答