在手动取消之前,大约2分钟内运行的负载突然变为90分钟运行。
这是一个简单的影子查询:
select fields
into shadow_table
from table
where date = '8/23/2011'
date
上有非聚集索引。
如果我更改查询以选择
top 300000
它在2秒内完成top 400000
它在3分钟内运行top 500000
我无聊等待并取消了它我们的服务器团队在运行时会显示很多自我阻止。
任何人都可以建议可能出现的瓶颈吗?
答案 0 :(得分:7)
过期统计信息。
自阻挡只发生在并行性上,超长并行运行(与规范相比)通常意味着过时的统计数据。它也可能是数据中基数的变化。
第1步应该在源表上运行UPDATE STATISTICS WITH FULLSCAN
。
答案 1 :(得分:2)
按照经过验证的Waits and Queues方法确定瓶颈。
当请求运行并行查询时,分析阻塞的正确方法是在子任务级别进行潜水,并查看阻止每个子任务的内容。一个人不应该以{{1}}作为等待类型停止,或者“自我阻止”作为解释。
CXPACKET
答案 2 :(得分:0)
如果它看起来似乎是一个档案查询 - 对于在运行时不会更新的记录,您可以完全关闭阻止。其他需要完整性但使用您的记录的查询不会受到影响 - 他们管理自己的锁定。
答案 3 :(得分:0)
还要确保将字段作为非聚集索引包含的一部分。如果不这样做,您将不得不使用RID查找返回表格来获取该数据。
create nonclustered index ix_whatever on YourTable (date)
include (field1, field2, ...)