定制加工
count(distinct())效率优化
2024-12-31 15:24

如何提升自身sql效率,更快得到想要的数据,是每一个使用sql的同学都需要学习和关注的事情。

sql作为面向大众的数据提取工具,除了研发、数据分析师,产品经理及业务运营同学也都有应用需求。只要sql无语法错误,保持等待,或长或短都是可以输出结果的。但是在数据量庞大或数据逻辑复杂时,或碰上线上资源紧张,或者好不容易等了3小时、结果发现数据有点异常需要修改后重跑,不知道有没有同学有相同的经历。

低效是每位同学都不乐见的,而避免这个问题就要求我们学习优化sql的方法,从而减少自己等数的焦虑时光。

而其中最常见的低效sql,就是count(distinct)。

故本文,就来结合本人学习及自身实践经验,给大家几点优化的建议,并配上实际效率以供参考。

常规的count(distinct)通常都跟着group by一起进行。

示例如下

select

  b.name,

  count(distinct a.user_id)

from table_a a

join table_b b on a.dashboard_id = b.id

group by name

order by count desc

常规优化点如下

1.先聚集,后join。

具体指先将表内的内容进行简化和聚集计算,join是基于一层聚集以后再进行的操作

如下

就是先将table_a按照dashboard_id进行了一次聚集,后续的join关联上name即可


    select

      b.name,

      new_a.ct

    from table_b as b

    join (

      select

        dashboard_id,

        count(distinct user_id) as ct

      from table_a as a  

      group by dashboard_id

    ) as new_a

    on new_a.dashboard_id = b.id

    order by new_a.ct desc

 

2.缩小group计算的数据集,提前对数据表进行限制、处理

先做处理,如下

就是先对a表中每一个user_id进行distinct,然后在上层计数。即把count和distinct拆成两步走。

*注意,这点尽量选择关联id与去重字段关系为1:n 且n越大效率越高。当数据大多为1:1 这一步优化效率不明显


    select

      b.name,

      log_counts.ct

    from table_b as b

    join (

      select distinct_a.dashboard_id,

      count(1) as ct

      from (

        select distinct dashboard_id, user_id

        from table_a as a

      ) as distinct_a

      group by distinct_a.dashboard_id

    ) as log_counts

    on log_counts.dashboard_id = b.id

    order by log_counts.ct desc

同时此点,还可以在join条件中添加多个限制条件,使匹配上的数据字段更少,缩小数据集,提高数据处理效率。如join on 条件1 and 条件2 and 条件3

实际用例

1. 使用最基本的count(distinct())搭配group by组合耗时9.85s

2.在left_join中添加多层and条件,耗时9.81s;收效不明显

3.调整为先聚集后,耗时2.45s,直接缩减为原始时间的25%,减少3/4的时间消耗。

4.最后缩小数据集,提前限制处理耗时2.74s

此处时间消耗要大于上一步优化结果。主要是由数据特性决定的。在数据量大,或者去重字段本身分类值多的情况下 分拆先distinct反而会有所耗时。

 

总结上述例子

在优化过程中,最明显有效的是尽量先聚集,再关联。再每部优化操作上,还需要了解数据情况、做好探查,才能找到适合的优化方式。否则可能反而做了无用功消耗资源。

另外,在使用count(distinct())时,需要注意后续是否有重复值计算,以防处理后得到了翻倍的数据值

    以上就是本篇文章【count(distinct())效率优化】的全部内容了,欢迎阅览 ! 文章地址:http://ww.kub2b.com/news/17158.html
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 企库往资讯移动站 http://ww.kub2b.com/mobile/ , 查看更多   
最新文章
光威复材2024年下降逾15%,连续两年发生下滑
3月31日晚,(300699.SZ)发布2024年财报,实现营收24.5亿元,同比下降2.69%;归母净利润7.41亿元,同比下降15.12%;扣非净利润6.6
看完超人气游戏改编的《我的世界大电影》,我整个人都方了
观影《我的世界大电影》,感觉自己真的方了。毕竟,已经领略过风靡全球的沙盒游戏《我的世界》中那方块的世界,还有游戏带给人的
手机大脑手机阅读「手机大脑」
为什么只要醒着我们就离不开手机,为什么疫情中的我们更容易自投罗网?为什么比尔·盖茨不让小孩用手机,乔布斯不让孩子碰iPad?
远洋集团(03377):拟3.22亿元出售北京盛永置业投资23%股权
智通财经APP讯,远洋集团(03377)发布公告,于2025年4月11日,卖方(公司全资附属公司北京银港房地产开发有限公司)拟向买方(日照钢
600375,停牌,退市风险解除!
*ST汉马(600375)即将去星摘帽。4月16日晚间,该公司公告,公司股票将于2025年4月17日(星期四)开市起停牌一天,并于2025年4月
300万像素手写滑盖三星G618行货大跌530三星滑盖手机「300万像素手写滑盖三星G618行货大跌530」
  【7月15日太平洋电脑网上海站】今天,三星奥运手机G618行货从2288元跌至新低1758元。530元的降幅对于这款三星众多奥运手机中
最新手机续航TOP10排行榜:小米14垫底,Mate60和iPhone15落榜,第一名让人很意外手机续航排行「最新手机续航TOP10排行榜:小米14垫底,Mate60和iPhone15落榜,第一名让人
随着科技的进步,手机已经成为了我们生活中不可或缺的一部分。而手机续航能力也成为用户选择新机的重要考量因素之一。特别是对于
“好房子”新规激发楼市活力 北京3月新旧房成交量齐增
每经记者:陈梦妤    每经编辑:魏文艺“今年第一季度,我们所有项目均超额完成销售任务,完成率均达100%以上。这一成绩主要
智能手机:重塑现代人生活方式的双刃剑现代手机「智能手机:重塑现代人生活方式的双刃剑」
随着科技的飞速发展,智能手机已经成为现代人生活中不可或缺的一部分。它为我们带来了便捷的信息获取、高效的社交方式以及
10块钱的VR跟7000元的到底有啥区别?部手机「10块钱的VR跟7000元的到底有啥区别?」
步入VR元年,VR的关注度甚至乎呈直线上升,但是还有很多VR小白根本不知道VR为何物。VR频道特设《小白玩VR》系列文章,没看过的,