2014-10-16 53 views
0

我想知道哪一個是優化的HIVE的最佳方式(0.12)查詢這三種可能的候選人中連接兩個表(也可能明白爲什麼):優化加入HIVE查詢:C

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

桌子有多大,是否適合記憶? – www 2014-10-16 14:08:21

+0

我會說,我正在使用的這個特殊功能,一般情況下不會,他們不會。 – lucacerone 2014-10-16 14:18:02

回答

1

我看到,所有這三個在MR-jobs,mappers和解釋計劃中都是一樣的。 通過注意表a足夠小地圖側連接優化被利用。通過切換表b上的過濾器的位置, 對用於從表b檢索數據的映射器的數量沒有影響。即便表b在子查詢中,情況也是如此。

唯一的優化是分區修剪,如果表b碰巧在col dt上分區,我認爲唯一的因素是與全表掃描相比減少了映射器的數量。