count(distinct)与groupby浅析
x在传统关系型数据库中,group by与count(distinct)都是很常见的操作。count(distinct colA)就是将colA中所有出现过的不同值取出来,相信只要接触过数据库的同学都能明⽩什么意思。
distinct查询
count(distinct colA)的操作也可以⽤group by的⽅式完成,具体代码如下:
select count(distinct colA) from table1;
select count(1) from (select colA from table1 group by colA) alias_1;
这两者最后得出的结果是⼀致的,但是具体的实现⽅式,有什么不同呢?
上⾯两种⽅式本质就是时间与空间的权衡。
distinct需要将colA中的所有内容都加载到内存中,⼤致可以理解为⼀个hash结构,key⾃然就是colA的所有值。因为是hash结构,那运算速度⾃然就快。最后计算hash中有多少key就是最终的结果。
那么问题来了,在现在的海量数据环境下,需要将所有不同的值都存起来,这个内存消耗,是可想⽽知的。所以如果数据量特别⼤,可能会out of memory。。。
group by的实现⽅式是先将colA排序。排序⼤家都不陌⽣,拿最见得快排来说,时间复杂度为
,⽽空间复杂度只有
。这样⼀来,即使数据量再⼤⼀些,group by基本也能hold住。但是因为需要做⼀次
的排序,时间⾃然会稍微慢点。。。
总结起来就是,count(distinct)吃内存,查询快;group by空间复杂度⼩,在时间复杂度允许的情况下,可以发挥他的空间复杂度优势。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。