gpt4 book ai didi

sql-server-2008 - 什么会导致 GetDate() 超时?

转载 作者:行者123 更新时间:2023-12-04 07:14:34 25 4
gpt4 key购买 nike

每隔几个月,网站的几个选定页面就会开始响应

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

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

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

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

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

GetDate() 应该是 @CurrentDate 无论如何,所以如果我切换它,它会运行良好。为什么这很重要?据我了解,GetDate 不应该是一个昂贵的调用。我知道 IsNull 是,但这也不重要,因为如果我只是将 GetDate 换成 CurrentDate,它可以很好地处理查询。

我假设 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)

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

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

EffectiveDate 和 ISNULL(ExpiryDate, @CurrentDate) 之间的 GetDate()

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

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

关于sql-server-2008 - 什么会导致 GetDate() 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8218392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com