前段时间在面试橙鹰数据的时候被问了一道SQL执行顺序的题目,之前虽然写过很多sql,但是没有从一个更高的视角来看自己写的代码,更不要提该如何优化了。随着数据量的增大,掌握sql的执行原理并进行优化是一项非常必要的技能。这篇文章会对一个sql语句的执行顺序进行总结,并进一步推导出可以优化的点。
因为工作时以hivesql为主,所以本文以hivesql进行讲解。
hive是基于Hadoop的Map Reduce
总体顺序:
from ..on .. join .. .. where .. select .. group by .. having .. order by
在map阶段
- from 加载,进行表的查找和加载
- where过滤
- select查询
- group by 执行分组后的相关计算
- map端文件合并
在Reduce阶段
1.group by :对map端发来的文件进行合并 - select : 过滤列用于输出结果
- limit排序
知道了hive的执行顺序后,我们来看几条可以提升hive速度的方式。
原则一:分区一定要加。
原则二:连接表时使用相同的关键词,这样只会产生一个job。
原则三:减少每个阶段的数据量,只选出需要的,在join表前就进行过滤。在实习时,有时候为了减少代码量,包含了多余的字段,导致速度会变慢一些。
原则四:map端聚合。在上data mining的时候,写map reduce程序,有时候会在mapper和reducer之间加一个combinator,提前进行合并以减少通信成本。
hive.map.aggr=true; // 用于设定是否在 map 端进行聚合,默认值为真hive.groupby.mapaggr.checkinterval=100000; // 用于设定 map 端进行聚合操作的条目数
原则五:大表放后面。在执行多个表时,会先将前面的表放到缓存,因此最好将大表放到最后。
以上是我在实习时候使用的一些技巧,还有很多hive设置的技巧可以参考一下链接,等我亲自实践后再更新到上面。
网友评论