增加“select top”返回的行会突然变得非常慢

时间:2011-08-24 15:33:05

标签: sql sql-server performance

在手动取消之前,大约2分钟内运行的负载突然变为90分钟运行。

这是一个简单的影子查询:

select fields
into shadow_table
from table
where date = '8/23/2011'

date上有非聚集索引。

如果我更改查询以选择

  • top 300000它在2秒内完成
  • top 400000它在3分钟内运行
  • top 500000我无聊等待并取消了它

我们的服务器团队在运行时会显示很多自我阻止。

任何人都可以建议可能出现的瓶颈吗?

4 个答案:

答案 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, ...)