每隔几个月,网站的某些选定页面将开始响应
超时时间已到。在操作完成之前超时或服务器没有响应。
我运行SQL Server Profiler来查看数据库挂起的位置。它在特定的存储过程上。因此,我接受了存储过程调用,并通过Management Studio运行了它。在不到一秒的时间内返回数千行。
打开该过程,我看到它只是一个简单的select语句。如果我取出select语句并在新的查询窗口中运行它,则Management Studio将挂起。
因此,我开始分段运行它,并找到导致查询挂起的行
and GetDate() between EffectiveDate and ISNULL(ExpiryDate, @CurrentDate)
无论如何,
GetDate()
应该是@CurrentDate
,所以如果我切换它,它将运行良好。为什么这仍然重要?据我了解,GetDate
应该不是一个昂贵的电话。我知道IsNull
是,但这也不重要,因为如果我将CurrentDate换成GetDate,它可以很好地处理查询。我是否可以假设
getdate
导致此查询间歇性地挂起?它将如何/为什么这样做?正如我之前所说的,此错误在3月23日,7月27日,10月25日以及现在的11月21日突然出现。它似乎总是在月底附近发生。我确信在这段时间内没有任何事情发生(预定的任务,维护等)
这是在生产服务器上,因此我还没有真正花时间调试问题。该站点一旦关闭,就必须重新启动。我知道如何解决它,我只需要在存储过程上强制重新编译,但是没有人知道是什么原因引起的吗?
SQL Server还有另一个UAT数据库,相同的过程也将挂在该数据库上。但是,具有完全相同的代码行的其他存储过程可以在两个数据库上正常运行。
编辑:我必须将网站备份,所以我重新编译了存储过程。该站点现在运行正常。该查询仍然不能单独运行。
最佳答案
我把问题弄错了。我正在分段运行的查询基本上是:
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
可能不是根本原因,但这绝对是出现问题的第一个迹象。关于sql-server-2008 - 什么会导致GetDate()导致超时?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8218392/