【问题标题】:Sporadic SQL Timeouts with joins, good index带有连接的零星 SQL 超时,良好的索引
【发布时间】:2011-07-06 13:32:41
【问题描述】:

我有一个查询在某些情况下会超时,但在其他情况下不会。我正在使用 sql server 2008,mvc3,ef。

查询相当大(EF 代码),但是,在 QA 中使用 Profiler 中的确切查询进行调查后,所有分支都使用索引查找。这是一个两个或三个表连接,具体取决于哪个查询(大约 4 个不同的查询,每个有 4 个变体,具体取决于我正在查询的列)。这些表大约有 400k、100k、1.2m 行。但是,即使在 400k - 100k 加入时我也会超时。我一次要分页 50 条记录,但计数也会超时。

我正在寻找一些关于如何确定导致超时的建议。由于它在某些情况下会在 5 秒内运行并显示在页面上,而在其他情况下会超时,我认为这不是查询。我宁愿不增加超时阈值。

我尝试使用 SSMS 中的报告来查找阻塞事务、资源锁定、我已设置读取未提交、查看配置文件表...

值得怀疑的一件事是这些表每天更新一次 - 使用大量删除和批量导入。统计数据可以关闭还是索引?我每晚重建大部分索引,但不确定这些表。有没有办法验证这种情况?我可以在导入时间后重建索引,不会有太多的停机时间,而且比零星的超时要好。但我还是不确定是不是这个。

【问题讨论】:

  • 有可能被阻止吗?在我看来,这听起来像是争论。如果其他人正在更新或选择意外级别的锁升级(即 SELECT ... WITH (TABLOCKX)),则可能会导致这种情况。
  • 没有阻塞事务或任何主要的锁——我一直在关注它。

标签: sql-server sql-server-2008 timeout


【解决方案1】:

我建议您在导入后立即对您的索引进行重组(以便它仍然为您的用户保持在线状态),看看是否有帮助。我会在导入后检查索引的碎片,以查看它们处于什么状态以及是否有帮助。

我能想到的另一件事是,您的查询可能会受到 DOP 的影响(Parrallesism 的程度

我们可以使用Query Hints (MSDN LINK)改变查询的运行方式

HTH,

学习

【讨论】:

  • 我认为这可能是真正的问题。我会看看平行度,看看显示什么 - 我从来没有想过这个提示,谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2013-01-16
  • 2015-05-30
相关资源
最近更新 更多