SQL:奇怪的查询性能行为

马辛

我有两个表:

  • Nodes -非常小的桌子,大约20行
  • Events -很大的桌子,大约有1000万行

和以下查询:

select 
    e.DeviceAlias as Mac, n.NodeId, n.city as City, n.street as Street, e.Status,
    CASE WHEN e.Status = 'U' THEN 'Unknown' ELSE 'Known' END as 'Source', 
    COUNT (*) as 'Count', 
    SUM(CASE WHEN e.SentMessageId > 0 THEN 1 ELSE 0 END) as SentMsgCount
from 
    events e
join 
    Nodes n on e.NodeId = n.NodeId
where
    e.InsertDate >= @startdate
    and e.InsertDate <= @enddate
group by 
    e.DeviceAlias, e.Status, n.NodeId, n.city, n.street

查询执行超过5分钟。我已应用了所有必需的索引,并且sql perf advisor建议不要使用其他索引或统计信息。但是,如果我摆脱了联接并执行以下查询:

select 
    e.DeviceAlias as Alias, NodeId,
    CASE WHEN e.Status = 'U' THEN 'Unknown' ELSE 'Known' END as 'Source', 
    COUNT (*) as 'Count', 
    SUM(CASE WHEN e.SentMessageId > 0 THEN 1 ELSE 0 END) as SentMsgCount
from 
    events e
where
    e.InsertDate >= '2014-07-01'
    and e.InsertDate <= '2014-11-28'
group by 
    e.DeviceAlias,nodeid, e.Status

它在30秒内执行。

一种简单的解决方案是使用第二个查询,并用c#代码填充Nodes表中的其余数据。

但这令我困扰,为什么用这么小的表进行连接会带来如此巨大的性能开销?有没有更好的办法?

马辛

erikkallen,你是我的男人;)更新统计信息可以将执行时间减少到38s!无论如何-WTF?我已将此数据库的自动更新统计信息设置为true ...事件表的增长非常快,因此,自动更新应每隔几个小时进行一次,具体取决于“表有500多行,并且增加了500 + 20%自上次更新以来的表大小”规则(来自http://www.pythian.com/blog/sql-server-statistics-maintenance-and-best-practices/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章