distinct 需要将 colA 中的所有内容都加载到内存中,大致可以理解为一个 hash 结构,key 自然就是 colA 的所有值。因为是 hash 结构,那运算速度自然就快。最后计算 hash 中有多少 key 就是最终的结果。
count(distinct)吃内存,查询快;group by 空间复杂度小,在时间复杂度允许的情况下,可以发挥他的空间复杂度优势
! group by 是先排序后分组
语句说明
优化建议
优化样例
1 2 3 4 5 6 7
-- 低效率 20% -- distinct,导致map阶段无法对输出结果去重,必须将id作为key输出 -- 从而 Shuffle大量的数据,并且进行排序聚合等处理 SELECTCOUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...;
-- 高效率 100% SELECTCOUNT(*) FROM (SELECTDISTINCT id FROM TABLE_NAME WHERE … ) t;
常用 SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-- group by 统计多列 select t.a, sum(t.b), count(t.c), count(t.d) from ( select a, b, null c, null d from some_table unionall select a, 0 b, c, null d from some_table groupby a,c unionall select a, 0 b, null c, d from some_table groupby a,d ) t;