1 表连接优化
将小表放在前面,
Hive假定查询中最后的一个表是大表。它会将其它表缓存起来,然后扫描最后那个表。因此通常需要将小表放前面,或者标记哪张表是大表:/streamtable(table_name) /
使用相同的连接键
当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。
尽量尽早地过滤数据
减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。
尽量原子化操作
尽量避免一个SQL包含复杂逻辑,可以使用中间表来完成复杂的逻辑
2 用insert into替换union all
如果union all的部分个数大于2,或者每个union部分数据量大,应该拆成多个insert into 语句,实际测试过程中,执行时间能提升50%。示例参考如下:
insert overwite table tablename partition (dt= …)
select … from ( select … from A
union all
select … from B union all select … from C ) R
where …;
可以改写为:
insert into table tablename partition (dt= …) select … from A WHERE …;
insert into table tablename partition (dt= …) select … from B WHERE …;
insert into table tablename partition (dt= …) select … from C WHERE …;
3 order by & sort by
order by : 对查询结果进行全局排序消耗时间长,需要set hive.mapred.mode=nostrict
sort by : 局部排序,并非全局有序,提高效率。
4 limit 语句快速出结果
一般情况下,Limit语句还是需要执行整个