union all 和 group by 的顺序问题

本文通过三个实验对比了SQL中UnionAll及GroupBy不同使用顺序对CPU时间和执行时间的影响,并总结了每种方式的特点,为SQL查询优化提供了实用的参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过三个实验,来看 union all 及 group by 不同的使用顺序对CPU时间及耗时的影响

1. 先Union All, 再Group By
select inctmid ctmid,cnlid,inwhsid whsid,sum(qty) qty,goodsid 
from
(     select inctmid,cnlid,inwhsid,qty,goodsid 
       from DtrBill a,DtrDetail b
       where a.billno=b.billno 
       union all
       select inctmid,cnlid,inwhsid,-1*qty qty,goodsid 
       from DtrBillRet a,DtrDetailRet b
       where a.billno=b.billno
)a
group by inctmid,cnlid,inwhsid,goodsid

2. 分别Group By,再Union All,再Group By
select inctmid ctmid,cnlid,inwhsid whsid,sum(qty) qty,goodsid 
from
(    select inctmid,cnlid,inwhsid,sum(qty) qty,goodsid 
      from DtrBill a,DtrDetail b
      where a.billno=b.billno 
      group by inctmid,cnlid,inwhsid,goodsid
      union all
     select inctmid,cnlid,inwhsid,sum(-1*qty) qty,goodsid 
     from DtrBillRet a,DtrDetailRet b
     where a.billno=b.billno
     group by inctmid,cnlid,inwhsid,goodsid
)a
group by inctmid,cnlid,inwhsid,goodsid

3. 先Group By,再Union
select inctmid,cnlid,inwhsid,sum(qty) qty,goodsid 
from DtrBill a,DtrDetail b
where a.billno=b.billno 
group by inctmid,cnlid,inwhsid,goodsid
union 
select inctmid,cnlid,inwhsid,sum(-1*qty) qty,goodsid 
from DtrBillRet a,DtrDetailRet b
where a.billno=b.billno
group by inctmid,cnlid,inwhsid,goodsid

4. 执行计划上的不同: 实验 2,3 多了两个分支上的Hash匹配操作

5. 实验结果及结论


方式

CPU时间

占用时间

结论

1

2275

362

并行度高,但最耗CPU资源

2

1622

416

并行度中等,最节省CPU资源(貌似是折中的选择)

3

1811

507

并行度最低,消耗CPU资源中等




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值