我有两个表:
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] 删除。
我来说两句