我想知道哪一个是优化HIVE(0.12)查询的最佳方法,在这三个可能的候选者中加入两个表(并且可能理解为什么):
SELECT * FROM a join b ON (a.id = b.id) WHERE b.dt = "2014-09-01";
或
SELECT * FROM a JOIN b ON (a.id = b.id AND b.dt = "2014-09-01") ;
或
SELECT * FROM a JOIN (
SELECT * FROM b where dt = "2014-09-01" ) c
ON a.id = c.id ;
我无法控制表的存储和分区方式,所以我的问题更多 一般最佳实践而非特定案例。我确信a.id = b.id只有在b.dt =' 2014-09-01'所以我想限制可以加入的数据以提高速度(b是一张巨大的表格)。
阅读HIVE文件我理解通常最好是a是最小的表而b是(非常)大的;但我无法理解 上面显示的不同查询将表现出来。
如果我还有其他方法可以使用,我也想了解它。
答案 0 :(得分:1)
我看到三个在MR作业,使用的映射器和解释计划方面都是相同的。 通过注意表a足够小,使用了映射侧连接优化。 通过切换表b上的过滤器的位置,对用于从表b中检索数据的映射器的数量没有影响。即使表b在子查询中也是如此。
唯一的优化是分区修剪,如果表b碰巧在col dt上进行了分区,我认为这是减少映射器数量的唯一因素,而不是全表扫描。