优化配置单元查询中的连接:c

b91juud3  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(233)

我想知道哪种方法是优化连接这三个可能候选表中的两个表的配置单元(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是(非常)大的表;然而,我无法理解上面显示的不同查询在性能方面的表现。
如果有别的方法我可以用的话,我也想知道。

xtupzzrd

xtupzzrd1#

我发现这三个词在“乔布斯先生,Map绘制者使用和解释计划”方面是相同的。通过注意表a足够小,可以使用map-side连接优化。通过切换表b上过滤器的位置,对用于从表b检索数据的Map器的数量没有影响。即使表b在子查询中也是如此。
唯一的优化是分区修剪,如果表b恰好在列dt上分区,我看到唯一的因素是减少Map器的数量,而不是一个完整的表扫描。

相关问题