可以使用“WITH RECOMPILE”选项来减少阻塞超时吗?

时间:2014-03-03 21:19:30

标签: sql sql-server sql-server-2008 sql-server-2012 recompile

我正在处理我从不再在公司的人那里继承的更新程序。

我在标题后面找到了包含WITH RECOMPILE选项的过程。在笔记中,它表示已添加"以减少阻止"

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

根据我的经验,我从来没有听说WITH RECOMPILE选项有助于阻止甚至与阻止有任何关联。

我是否对这个选项缺乏一些了解,或者实施它的人是那个对它做什么感到困惑的人?有没有人听过这个作为阻止的解决方案?

注意:这是在服务器仍在运行SQL Sever 2008版本时完成的。

2 个答案:

答案 0 :(得分:2)

OPTION WITH RECOMPILE强制Sql Server重新编译执行计划,即使内存中存在缓存的现有计划也是如此。

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

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

答案 1 :(得分:1)

我可以想到它可以帮助的一种方式(我实际上经历过这种方式)。每个存储过程都有一个缓存的查询计划。如果执行存储的方式因某些值的不同而有时会出现问题,因为缓存的查询计划可能完全不适合。

假设你有一个看似

的存储过程
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提出新的执行计划来缓解这些问题。