记⼀次distinct导致的sql效率问题
问题描述:distinct的使⽤可能导致SQL的性能下降,也可能是distinct和group by⼀起使⽤的原因
distinct查询场景:查询有多个组织的⼈员数据,⼈员在a表有多个组织,所以查询出来是多⾏记录
数据量:a表65W+数据,b表54W+数据,c表54W+数据,d表4W+数据,e表8000+数据
下图SQL会显⽰多⾏数据,然后再⽤distinct去重
select distinct a.ORG_CODE,d.DEPT_NAME,b.PROVINCE_LOGIN_NAME,c.STAFF_CODE,c.STAFF_NAME,e.DICT_DISPLAY POSITION_LEVEL
from ua_staff_in_position a,ua_account b,ua_organization d,ua_staff c
left join ua_dict_data e on e.dict_type='POSITION_LEVEL' and e.DICT_VALUE=c.POSITION_LEVEL
where a.STAFF_CODE=b.STAFF_CODE
and a.STAFF_CODE=c.STAFF_CODE
and d.ORG_CODE=a.ORG_CODE
and a.SET_ID_DEPT='Cm013'
可以看到索引的级别都是ref的,还不错,查询速度很快(execution: 253 ms, fetching: 88 ms)
后来需求需要多个组织在⼀⾏显⽰,于是对SQL做了修改,想到可以⽤group_concat函数来实现之
select distinct a.ORG_CODE,group_concat(d.DEPT_NAME) as DEPT_NAME,b.PROVINCE_LOGIN_NAME,c.STAFF_CODE,c.STAFF_NAME,e.DICT_DIS from ua_staff_in_position a,ua_account b,ua_organization d,ua_staff c
left join ua_dict_data e on e.dict_type='POSITION_LEVEL' and e.DICT_VALUE=c.POSITION_LEVEL
where a.STAFF_CODE=b.STAFF_CODE
and a.STAFF_CODE=c.STAFF_CODE
and d.ORG_CODE=a.ORG_CODE
and a.SET_ID_DEPT='Cm013'
group by a.STAFF_CODE
加了个函数并没有影响到索引级别,还是ref的
执⾏之,发现dataGrip⼀直在转圈圈,结果⼀直都出不来
执⾏了⼤概⼗分钟还没有出来结果,我取消了,那肯定不能忍受
于是把distinct去掉试试,可能distinct和group by的功能重合了,去掉之后
500 rows retrieved starting from 1 in 657 ms (execution: 552 ms, fetching: 105 ms)
select a.ORG_CODE,group_concat(d.DEPT_NAME) as DEPT_NAME,b.PROVINCE_LOGIN_NAME,c.STAFF_CODE,c.STAFF_NAME,e.DICT_DISPLAY P from ua_staff_in_position a,ua_account b,ua_organization d,ua_staff c
left join ua_dict_data e on e.dict_type='POSITION_LEVEL' and e.DICT_VALUE=c.POSITION_LEVEL
where a.STAFF_CODE=b.STAFF_CODE
and a.STAFF_CODE=c.STAFF_CODE
and d.ORG_CODE=a.ORG_CODE
and a.SET_ID_DEPT='Cm013'
group by a.STAFF_CODE;
果然,sql执⾏⽴马恢复正常
问题是解决了,但是并没有到相关的资料,解释问题产⽣的原因,⼤部分⽂章是⽐较distinct和group by的性能,也有说distinct是⼀个双重循环,然后⽐较去重的过程,所以导致性能⽐较差,所以能⽤group by就尽量⽤group by吧
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论