MSSQL2005-由嵌套失误感受到的强大智能优化功能
在统计一组数据时用到了子查询(子查询用到了count,父查询用了sum)
后语句优化为无子查询
但是跟踪两次的执行计划和IO统计,发现
1、有子查询时扫描计数和逻辑读取远高于无子查询的语句
2、无子查询语句反而多了排序步骤
原来含子查询的语句写错了,错成什么样了呢?
外面的sum求和对象弄错了,导致的结果就是主语句的查询字段没有一个用到子查询中的count结果
好吧,记录到这里有些明白了,好像又有点迷糊
为什么含子查询的语句性能反而更差,是因为count没有被主查询的select使用所以没有被执行吗?
如果是的话为什么group by 的顺序会低于select呢?
如果不是的话为什么子语句都使用group by和聚合函数的性能反而比单语句要好呢?
附:
1 SET STATISTICS IO ON 2 SET STATISTICS TIME ON 3 DECLARE @startDate DATETIME,@endDate DATETIME 4 SET @startDate = ‘2015-04-01‘ 5 SET @endDate = ‘2015-05-01‘ 6 select staffid,staffname,userid,storename,name,convert(varchar(10),initTime,120) date, 7 SUM(CASE WHEN name=‘a‘ THEN 1 ELSE 0 END) a, 8 SUM(CASE WHEN name=‘b‘ THEN 1 ELSE 0 END) b, 9 SUM(CASE WHEN name=‘c‘ THEN 1 ELSE 0 END) c, 10 SUM(CASE WHEN name=‘d‘ THEN 1 ELSE 0 END) d 11 from V_001 where initTime between @startDate and @endDate group by staffid,staffname,userid,storename,name,convert(varchar(10),initTime,120) 12 RETURN; 13 select 14 staffid,staffname,userid,storename,date, 15 SUM(CASE WHEN name=‘a‘ THEN 1 ELSE 0 END) a, 16 SUM(CASE WHEN name=‘b‘ THEN 1 ELSE 0 END) b, 17 SUM(CASE WHEN name=‘c‘ THEN 1 ELSE 0 END) c, 18 SUM(CASE WHEN name=‘d‘ THEN 1 ELSE 0 END) d 19 from 20 ( 21 select staffid,staffname,userid,storename,name,convert(varchar(10),initTime,120) date,count(1) c from V_001 where initTime between @startDate and @endDate group by staffid,staffname,userid,storename,name,convert(varchar(10),initTime,120) 22 ) as tmp GROUP BY staffid,staffname,userid,storename,date
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。