Hive Sql 性能优化——看这一篇就够啦!

今天听组内SQL小王子分享了一篇Hive Sql性能优化的总结报告,甚觉精彩,赶紧来分享给大家!!

一、尽量使用索引,避免全表查询

① 在where 和 order by 常用的字段上创建索引,提升效率的核心!但是用不到的字段就别加索引了,反而浪费存储空间;频繁更新的字段也不适合创建索引
② where子句中尽量避免进行nul值判断,少使用!=,<>等操作符,等号左边避免函数、算数和其它表达式运算,这此操作都会导致索引无效,启动全表查询
③ where 子句中将in,not替换成exists和not exists,将会避免掉全表查询,同时如果是数值用Between替代in也是很好的选择
④ where 子句中尽量少用or,如果一定要多条件并集查询,可以使用Union All替代OR
⑤ where子句中 LIKE 字符第1个不要是%,这样会启动全表查询

二、多表关联小技巧

避免笛卡尔积出现,如果多表关联,在符合业务需求情况下,能去重就都去重,比如登录表和充值表就是多条记录表,如果要关联获得登录用户的累计充值金额,则可以将登录表先去重,充值表汇总,再关联
② 多表关联小表在前,大表在后,hive会默认第1个表纳入内存,然后再对大表进行关联计算,小表放前将会大大提升效率
尽量早过滤,减少每个阶段的数据量,过滤条件执行顺序:关联表中的WHERE>ON>WHERE子句,最好先将每个要关联的表都变成子查询语句,先用where 进行过滤,再在ON里面进行过滤,速度不止快10倍!
④ 多表最好都用别名,并且在各子句中都用别名+字段的方式引用,会大大提升效率

三、避免数据倾斜

① 尽量少用COUNT(DISTINCT),可以用COUNT+GROUP BY,如果一定要用,可以将重复特别多的(例如NULL)先过滤掉,再单独处理
② 选择分布较为均匀的键作为关联KEY,如用户ID,日期,不要用性别,年龄等分布不均的字段
③ 在使用JOIN时,关联键存在大量空值或者某一特殊值,如”NULL”,可以空值单独处理,不参与关联,或者空值或特殊值加随机数作为关联键;不同数据类型的字段关联,则可以转换为同一数据类型之后再做关联

四、其余优化技巧

① 任何时候都要尽量避免使用 SELECT *** ,能用列名就用列名
② 尽量
不要建立临时表**,以减少系统表资源的浪费,但如果源表实在太大,必须建临时表时,可以用CREATE TABLE+INSERT TABLE的方式分批插入,会比仅用CREATE+TABLE要快很多
子查询会比join快,虽然并不绝对,但是绝大部分情况下都是
尽量少排序,如果一定要排序可以用sort by 替换order by ,order by 是全局排序,会占用大量的资源,sort by是局部排序,与distribute by一起使用,速度更快,但这个也要看实际需求
⑤ 尽量用Union All替代Union,因为Union是要组合后排序去重的,Union All是直接扫描源表即可,效率更高
⑥ 尽量使用数值型字段而不是字符型字段

其余SQL系列文章如下,后续还会出Excel,Tableau,Python等数据分析必备的技巧学习方法,感兴趣的小伙伴可关注下我喔

SQL技巧初级系列①—建表/更新表/删除表
https://blog.csdn.net/cindy407/article/details/90340753
SQL技巧初级系列②—聚合和排序(group by,having,order by)
https://blog.csdn.net/cindy407/article/details/90341410
SQL技巧初级系列③——数据拼接(集合运算union和列连接join)
https://blog.csdn.net/cindy407/article/details/90344787
SQL技巧中级系列①——字符串函数的使用
https://blog.csdn.net/cindy407/article/details/90345018
SQL技巧中级系列②——日期函数的使用
https://blog.csdn.net/cindy407/article/details/90345626
SQL技巧高级系列①——窗口分析函数的使用
https://blog.csdn.net/cindy407/article/details/90346138
SQL技巧高级系列②——聚合函数和CASE WHEN的使用
https://blog.csdn.net/cindy407/article/details/90346504

你可能感兴趣的:(SQL)