DB2数据库DISTINCT与GROUP BY 对比

  最近在写实现同样功能SQL语句,当使用DISTINCT时效率非常低,而GROUP BY 的效率远远高于DISTINCT.现贴出语句供参考.

这两条SQL语句功能为,查询清单表中有多少用户进行通话.

DITINCT语句:

--2395517 312S
SELECT COUNT(DISTINCT USR_ID) FROM APP.CR_GSM_DETAIL_MS_730_1312 WITH UR;

执行计划:

 

GROUP BY 语句:

--2395517 34.4S
SELECT COUNT(USR_ID) FROM(
SELECT USR_ID FROM APP.CR_GSM_DETAIL_MS_730_1312 GROUP BY USR_ID
)C
WITH UR;

执行计划:

 

  可以看到两条语句执行结果,一共有239万用户通话,DISTINCT语句执行时间312秒,GROUPBY 语句34.4秒.考虑缓存问题, 两条语句交叉执行三遍结果一样.

查看DB2资料没有找到group by与distinct相应的算法,但找到IBM官网上的sql编写建议:DISTINCT与GROUP BY 都进行排序操作,但DISTINCT要排序整个表,而GROUP BY是在分组之后再进行排序,所以可以解释DISTINCT效率低于GROUP BY.

从执行计划也可以证明IBM官方建议,从两条语句执行到第三步时,DISTINCT的CPU成本明显高于GROUP BY,但GROUP BY 的IO成本高于DISTINCT,因为它首先形成一个内嵌视力再做COUNT(*)操作.

根据以上分析可以得出:当一个表按分组字段来说,字段分组数据不是唯一但是要取字段唯一值,请使用GROUP BY .因为GROUP BY分组再排序,数据量相比DISTINCT大大减少.当一个按分组来说,数据是唯一的,那么DISTINCT与GROUP BY没有区别.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值