首页
学习
活动
专区
圈层
工具
发布

count(distinct) 与group by 浅析

github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 x在传统关系型数据库中,group by与count...count(distinct colA)就是将colA中所有出现过的不同值取出来,相信只要接触过数据库的同学都能明白什么意思。...count(distinct colA)的操作也可以用group by的方式完成,具体代码如下: select count(distinct colA) from table1; select count...上面两种方式本质就是时间与空间的权衡。 distinct需要将colA中的所有内容都加载到内存中,大致可以理解为一个hash结构,key自然就是colA的所有值。...总结起来就是,count(distinct)吃内存,查询快;group by空间复杂度小,在时间复杂度允许的情况下,可以发挥他的空间复杂度优势。

1.2K10

Hive Count Distinct优化

日常统计场景中,我们经常会对一段时期内的字段进行去重并统计数量,SQL语句类似于 SELECT COUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...; 这条语句是从一个表的符合...由于引入了DISTINCT,因此在Map阶段无法利用Combine对输出结果去重,必须将id作为Key输出,在Reduce阶段再对来自于不同Map Task、相同Key的结果进行去重,计入最终统计值。...这唯一的Reduce Task需要Shuffle大量的数据,并且进行排序聚合等处理,这使得它成为整个作业的IO和运算瓶颈。...原来Hive在处理COUNT这种全聚合(full aggregates)计算时,会忽略用户指定的Reduce Task数,而强制使用1。我们只能采用变通的方法来绕过这一限制。...改进后的SQL语句如下: SELECT COUNT(*) FROM ( SELECT DISTINCT id FROM TABLE_NAME WHERE … ) t; 在实际运行时,我们发现

3.8K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    count(distinct) 玩出了新花样

    那还有必要单独为 count(distinct) 写一篇文章吗? 此刻,想到一句台词:别问,问就是有必要。...第 5 步,处理 count(distinct) 聚合逻辑。 处理聚合逻辑分两种情况: 没有使用磁盘文件,分组记录少,红黑树一次都没有写满过,所有数据都在内存中。...8. sum(distinct)、avg(distinct) 不一样 sum(distinct)、avg(distinct) 也需要去重,但是和 count(distinct) 不一样的地方在于:sum...因此,对于 sum(distinct)、avg(distinct) 来说,只会选择使用红黑树去重,并且也不会创建一个空的 MEMORY 临时表,这两点和 count(distinct) 不一样。...第 8 小节,介绍了 sum(distinct)、avg(distinct) 只能用于整数、浮点数求和、求平均数,它们和 count(distinct) 不一样的地方在于:只会选择使用红黑树去重,不需要创建

    1.9K20

    openGauss - 向量化执行引擎 - distinct分组聚合的实现

    openGauss支持以下聚合语法:以count为例: 1)count(distinct id1) 2)count(id1 order by id1) 这两种方式都用到了排序,初始化时:distinct...为true,比如当聚合是下面的样子:select count(distinct id1),count(id2) from t group by id1,id2时,第2个count即不是distinct也不是...order by,那么流程中通过m_hashDistinct进入distinct处理分支后,又是怎么分辩出第二个count是普通聚合呢?...1)当然需要注意order by的场景与distinct聚合的区别,比如count(id1 order by id1):首先进行排序,然后从排序结果中取出一批值;因为仅order by所以equalfns...2)若多个count中,非distinct和非order by的聚合,因为他们的peragg_stat->numSortCols为0,则不用进入该排序并聚合流程。

    58210

    告别 Count Distinct 慢查询:StarRocks 高效去重全攻略

    SELECT count(distinct case when lo_discount > 1 then lo_orderkey else 0 end) as ndv11, count(distinct...SELECT count(distinct case when lo_discount > 1 then lo_orderkey else 0 end) as ndv11, count(distinct...对于大规模聚合键表,读取操作时底层存储的合并成本可能会超过直接扫描详细表的成本。查询性能可能会比直接在去重键表上执行 COUNT DISTINCT 更差。...对于小型数据集,可以使用聚合表。但对于大数据集或宽表,可能会出现与 HLL 聚合表相同的问题:选择多个键可能会影响导入/合并性能,并增加大数据集的查询性能开销。...end)) as ndv12FROM lineorderGROUP BY 1, 2, 3;4.2.2 非精确去重精确去重无法保证基于物化视图计算的结果依然是精确的,与直接使用 count distinct

    44910

    Count-Distinct实践: 万亿级数据量任务优化方式

    join实践: 万亿级数据量任务优化历程 单字段去重 先看一个简单的sql ,pv_id 去重计数 SELECT visit_type, count(DISTINCT pv_id)...多字段去重 SELECT visit_type, count(distinct pv_id), count(distinct item_id) from exp_table where...ds=20220320 group by visit_type; 这次同时需要对pv_id与item_id去重计数,如果还是按照上述的优化方式将visit_type、pv_id、item_id组合很显然已经行不通了...再重新按照单字段优化方式思考,希望按照所有的去重字段组合的情况下,仍然能够保证相同pv_id或者item_id都会分配在同一个reducer中去处理, 也是pv_id与item_id各自不影响其分配方式...思考 Q: 同时存在count distinct 与 sum 类的聚合该如何优化倾斜问题?

    1.2K30

    sparksql源码系列 | 一文搞懂with one count distinct 执行原理

    物理执行计划的几个阶段3、除了count distinct,没有其他非distinct聚合函数的情况的执行原理4、除了count distinct,有其他非distinct聚合函数的情况的执行原理5、关键点调试...,还要经过Final才是最终结果(count distinct 类型) Final: 起到的作用是将聚合缓冲区的数据进行合并,然后返回最终的结果 Complete: 不进行局部聚合计算,应用在不支持Partial...模式的聚合函数上(比如求百分位percentile_approx) 非distinct类的聚合函数的路线:Partial --> Final distinct类的聚合函数的路线:Partial -->...聚合函数的情况下执行原理 sql: select a,count(distinct b ) from testdata2 group by a Optimized Logical Plan-->Physical...聚合函数的情况下执行原理 sql: select a,count(distinct b),max(b) from testdata2 group by a Optimized Logical Plan-

    1.4K10

    从Approx_Count_Distinct到M7的CPU集成

    昨天和朋友交流,联想起Oracle的两个特性,approx_count_distinct 和 SQL in Silicon,从软件到硬件,从典型SQL入手的优化,Oracle一步一步走向细节和性能的极致...在Oracle 12c中,有一个新的函数被引入进来 - approx_count_distinct 。这个函数的作用是,当我们进行Count Distinct计算时,给出一个近似值。...在很多系统中,COUNT DISTINCT是个常见的操作,如果使用这个函数,则可能带来很好的性能改善。 以下是我非常简单的一个测试,可以看到基本的效果: ?...approx_count_distinct在大数据量下的表现会非常好,资源使用非常低,极其稳定。...count(*) 和 count distinct 都是非常常见的操作,也很消耗资源。从常见、常用的SQL入手,Oracle的一点点改进都会给用户带来帮助,在细节上的优化Oracle做到极致了。

    1K50

    count(*) count(1)与count(col)的区别

    一、执行结果 count(*) 和count(1) 都是统计行数,而count(col) 是统计col列非null的行数 二、执行计划   MyISAM与InnoDB,正如在不同的存储引擎中,count...null,不为null的按行累计加1,返回累加值 三、执行效率   1、如果在开发中确实需要用到count()聚合,那么优先考虑count(*),因为mysql本身对于count(*)做了特别的优化处理...有主键或联合主键的情况下,count(*)略比count(1)快一些。  没有主键的情况下count(1)比count(*)快一些。  如果表只有一个字段,则count(*)是最快的。...2、使用count()聚合函数后,最好不要跟where age = 1;这样的条件,会导致不走索引,降低查询效率。除非该字段已经建立了索引。...使用count()聚合函数后,若有where条件,且where条件的字段未建立索引,则查询不会走索引,直接扫描了全表。

    4.8K21

    MySQL COUNT(*) COUNT(1) 与 COUNT(列) 的区别

    文章目录 1.COUNT() 2.COUNT(*) COUNT(1) 与 COUNT(列) 的功能? 3. 统计表行数性能区别 3.1 COUNT(主键) 的执行过程?...第一种:近似值 第二种:额外表保存表记录数 参考文献 1.COUNT() COUNT() 是一个统计记录数的聚合函数,语法如下: COUNT(expr) [over_clause] 函数的参数 expr...对于 COUNT 的使用,常见的使用方式是: COUNT(*) COUNT(1) COUNT(列) 三者在功能和性能上有区别吗?且听我一一道来。...2.COUNT(*) COUNT(1) 与 COUNT(列) 的功能? COUNT(*) 返回结果集中所有记录数,包含字段为 NULL 的记录。 COUNT(1) 功能上等同于 COUNT(*)。...先说结论: COUNT(*) = COUNT(1) > COUNT(主键) > COUNT(字段) 要弄明白这个,我们得要深入 COUNT 的实现原理。

    1.1K10

    浅聊count(1)、count(*) 与 count(列名) 的区别

    (*),count(id),count(id2)查询结果如下: select count(*),count(id),count(id2) from #bla results 7 3 2 COUNT(*...)的优化 COUNT(*) 在 MySQL 中的优化与所使用的执行引擎密切相关,常见的执行引擎包括 MyISAM 和 InnoDB。...MyISAM 和 InnoDB 之间有许多区别,其中一个关键区别与接下来要讨论的 COUNT(*) 有关:MyISAM 不支持事务,其锁定级别为表级锁;而 InnoDB 支持事务,并且使用行级锁。...有些人认为COUNT(*) 在执行时会转换成 COUNT(1),因此 COUNT(1) 少了转换步骤,所以更快。...所以,对于 COUNT(1) 和 COUNT(*),MySQL 的优化是完全一样的,根本不存在谁比谁快! 那既然COUNT(*) 和 COUNT(1)一样,建议用哪个呢? 建议使用 COUNT(*)!

    1.1K10
    领券