什么可能导致GetDate()导致超时?

时间:2011-11-21 20:52:08

标签: sql-server-2008 getdate

每隔几个月,网站的一些选择页面就会开始回复

  

超时已过期。操作完成之前经过的超时时间或服务器没有响应。

我运行SQL Server Profiler以查看数据库挂起的位置。它位于特定的存储过程中。所以我接受了存储过程调用并通过Management Studio运行它。在一秒钟内返回几千行。

打开程序,我看到它只是一个简单的选择语句。如果我取出select语句并在新的查询窗口中运行它,Management Studio将挂起。

所以我开始分段运行它,找到导致查询挂起的行

and GetDate() between EffectiveDate and ISNULL(ExpiryDate, @CurrentDate) 
无论如何,{p> GetDate()应该是@CurrentDate,所以如果我切换它,它会运行正常。为什么这甚至重要呢?据我了解,GetDate不应该是一个昂贵的电话。我理解IsNull是,但这也不重要,因为如果我只是用GetDate换掉GetDate,它可以处理查询。

假设getdate导致此查询间歇性挂起,我是否正确?怎么/为什么会这样做?

有点背景,正如我之前所说,这个错误在3月23日,7月27日,10月25日和现在的11月21日出现了。它似乎总是发生在月底附近。我确信在此期间没有任何事情发生(计划任务,维护等)

这是在生产服务器上,所以我实际上无法花时间调试问题。一旦网站出现故障,就必须重新启动。我知道如何解决它,我只需要强制重新编译存储过程,但有没有人知道是什么原因造成的?

SQL Server还有另一个UAT数据库,同样的程序也会在该数据库上挂起。但是,具有完全相同代码行的其他存储过程在两个数据库上运行良好。

编辑:我必须重新启动网站,所以我重新编译了存储过程。该网站现在运行良好。但是查询仍然没有在它自己运行。

1 个答案:

答案 0 :(得分:0)

我误解了问题的原因。我运行的查询基本上是:

select *
from Item
left outer join category Subcategories on Subcategories.ItemKey = Item.Id,
Categories Category,
Availability
where Item.Id = @ItemId
  and GetDate() between Availability.EffectiveDate 
      and ISNULL(Availability.ExpiryDate, @CurrentDate) 

这显然不是在生产中运行的查询,只是一个匿名的例子。

此查询无法运行。为了让它运行,我最初注释掉了

and GetDate() between EffectiveDate and ISNULL(ExpiryDate, @CurrentDate)

如果我将GetDate()更改为@CurrentDate,也会运行。我确信GetDate是问题所在。但是,当我运行查询并注释掉Availablity行时,它运行正常。 Availability是一张庞大的表格。我运行了重新索引和统计更新,一切正常。我想我应该GetDate道歉。

编辑:这在完全不同的环境中再次发生。再次GetDate似乎是罪魁祸首。更改该行并运行该过程使一切工作再次起作用。 GetDate可能不应该归咎于根本原因,但这绝对是出现问题的第一个迹象。