我有一个查询,在某些情况下超时但不是其他情况。我使用的是sql server 2008,mvc3,ef。
查询相当大(EF代码),但是,在使用Profiler中的确切查询进行QA调查之后,所有分支都使用索引搜索。它是一个两个或三个表连接,具体取决于哪个查询(大约4个不同的查询,每个基于我正在查询的列的4个变体)。这些表有大约400k,100k,1.2m的行。但是,即使是400k-100k的加入,我也能获得超时。我一次只能传阅50条记录,但是我的计数时间已经超时了。
我正在寻找一些关于如何确定造成超时的原因的建议。由于它在某些情况下在5秒内运行并显示在页面上,而在其他情况下显示超时,我不认为这是查询。我宁愿不增加超时阈值。
我曾尝试在SSMS中使用报告寻找阻塞事务,资源锁定,我设置了read not commited,查看了profile表...
可疑的一件事是这些表每天更新一次 - 利用大量删除和批量导入。可以关闭统计数据还是索引?我每晚重建大部分索引,但在这些表格上不确定。有没有办法验证这种情况?我可以在导入时间后重建索引,停机时间不会太多,而且比零星的超时更好。但我仍然不确定是不是这样。
答案 0 :(得分:0)
我建议您在导入后直接对索引进行重新组织(以便它仍然保持在线状态),看看是否有帮助。我会在导入后检查索引的碎片,看看它们处于什么状态以及它是否有用。
我能想到的另一件事是,在我的脑海中,您的查询可能会受到DOP的影响(Parrallesism等级<永远不会拼写那个单词抱歉:()),所以看看每个查询是通过查看它的查询计划来超时。如果将鼠标悬停在连接的行等上,您将看到估计的行数与实际的行数。例如,如果您期望500k行但返回10行,然后SQLServer结束了您的查询执行计划。
我们可以使用Query Hints (MSDN LINK)
更改查询的运行方式HTH,
斯图