MSSQL2005-由嵌套失误感受到的强大智能优化功能

本文通过对比含子查询与不含子查询的SQL语句执行效率,分析了不同查询方式对数据库性能的影响。实验发现,虽然去除子查询减少了扫描计数和逻辑读取,但增加了排序步骤。文章还提供了具体的SQL示例代码。

在统计一组数据时用到了子查询(子查询用到了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

 

转载于:https://www.cnblogs.com/mouyuan/p/4527609.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值