大数据 SQL 优化

fansichao 2021-10-23 16:16:35
Categories: Tags:

原理解析

https://cloud.tencent.com/developer/article/1638968

distinct & group by

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大量的数据,并且进行排序聚合等处理
SELECT COUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...;

-- 高效率 100%
SELECT COUNT(*) FROM (SELECT DISTINCT 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
union all
select a, 0 b, c, null d
from some_table
group by a,c
union all
select a, 0 b, null c, d
from some_table
group by a,d
) t;

参考资源

Hive/HiveSQL 常用优化方法全面总结