Hive:在连接之前在子表中使用where子句是否有性能改进?

时间:2016-10-26 16:18:35

标签: sql performance join hive where

我想加入2个hive表。以下陈述之间是否存在性能差异?

basic_info的列:user_id,姓名,姓氏,生日,职业

account_info的列:user_id,account_id,type,balance

查询1:

SELECT b.user_id, a.account_id, b.name, b.lastname, a.balance
FROM account_info a
JOIN basic_info b
   ON a.user_id = b.user_id
WHERE b.occupation = 'lawyer'

QUERY2:

SELECT b.user_id, a.account_id, b.name, b.lastname, a.balance
FROM account_info a
JOIN 
   (SELECT user_id, name, lastname 
    FROM basic_info
    WHERE occupation = 'lawyer') b
   ON a.user_id = b.user_id

对我来说,第二个看起来更高效。但我找不到一个明确的说法。我在Apache的网站上发现的最近的事情是:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

  

在有条款的情况下发生联接。因此,如果要限制连接的OUTPUT,则需求应该在WHERE子句中,否则它应该在JOIN子句中。这个问题的一个主要问题是分区表。

但它给出的例子是分区不适用于这种情况。是否有正式文件表明查询2是否更好?

2 个答案:

答案 0 :(得分:1)

是的,Query-2应该运行得很快。如前所述,join在where子句之前发生。

但是你的官方文件问题 - Hive中有一个Predicate下推选项。默认情况下,此选项设置为false。可以使用

将其设置为true
  

设置hive.optimize.ppd = true;

当此选项设置为true时,连接发生在where子句之后。在您的情况下,如果您将此属性设置为' True',则您的查询应同时完成。当属性设置为false(默认行为)时,查询2应该快速完成。

由于HIVE具有谓词下推的显式属性,我们可以得出结论,当属性设置为false时,在where子句之前发生了连接。

答案 1 :(得分:0)

有多种方法可以编写这个sql。虽然,您的两个查询都返回相同的输出,但内部执行计划不同,并且执行时间可能有很大差异。
Hive explain command非常适合从调试和理解场景背后的查询执行计划开始。我希望explain命令可以帮助你找出两个命令之间的差异。

其他因素,Hive Map Joins and SMB(Sort-Merge-Bucket)提高了连接效率。