【发布时间】:2016-10-26 16:18:34
【问题描述】:
我想加入 2 个蜂巢表。以下语句之间是否存在性能差异?
basic_info 的列:用户 ID、姓名、姓氏、生日、职业
account_info 的列:user_id、account_id、类型、余额
查询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'
查询2:
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
连接发生在 WHERE 子句之前。因此,如果要限制连接的输出,则应在 WHERE 子句中提出要求,否则应在 JOIN 子句中。这个问题的一大困惑点是分区表。
但是给出的示例是针对分区而不是针对这种情况的。是否有官方文件表明 Query 2 更好?
【问题讨论】:
-
这两个查询的执行时间是多少?这应该是回答您问题的一种可衡量的方式。
-
在 mysql 或 oracle 等现代关系数据库上,这两个查询应该生成完全相同的执行计划。通常选择发生在加入之前。我不确定 Hive。最好是尝试查看实际的执行计划。
标签: sql performance join hive where