连接两个表时,where 和 join in Hive SQL 有什么区别?
What is difference between where and join in Hive SQL when joining two tables?
例如,
-- use WHERE
SELECT
a.id
FROM
table_a as a,
table_b as b
WHERE
a.id = b.id;
-- use JOIN
SELECT
t1.id
FROM
(
SELECT
id
FROM
table_a as a
) t1
JOIN (
SELECT
id
FROM
table_b as b
) t2 ON t1.id = t2.id
连接两个表时,Hive SQL 中 where
和 join
有什么区别?
像这样加入
FROM
table_a as a,
table_b as b
WHERE
a.id = b.id;
是一种不好的做法,因为通常情况下,WHERE 在连接后应用并将其转换为 JOIN 并在优化器上推送谓词,以将其转换为正确的连接并避免 CROSS 连接(没有 ON 条件的连接)。
尽可能使用显式 JOIN 和 ON
条件,这样优化器将确定它是一个 JOIN 条件,而且它是 ANSI 语法并且更容易理解。
对于像a.date between b.start and b.end
这样的不相等的连接条件,不可能在 ON 条件下使用,在这种情况下,它们可以移动到 WHERE。在这种情况下,如果您在 ON 条件中没有其他条件,则将使用交叉连接,并且在应用 WHERE 过滤器之后,这种连接会极大地重复 WHERE 过滤器之前的数据并导致性能下降。因此,尽可能始终在 ON 条件下使用显式 ANSI JOIN,始终在 ON 中使用所有相等条件,如果不可能在 ON 中使用它们,则在 WHERE 中仅使用非相等条件。将连接条件保留在 ON
中,仅在 WHERE
中进行过滤。优化器会在可能的情况下将过滤器推送到 JOIN 或连接之前,但最好不要仅依赖优化器,编写易于理解的良好 ANSI sql 并在需要时移植到另一个数据库。
您可以使用 EXPLAIN 命令检查计划中的差异。
例如,
-- use WHERE
SELECT
a.id
FROM
table_a as a,
table_b as b
WHERE
a.id = b.id;
-- use JOIN
SELECT
t1.id
FROM
(
SELECT
id
FROM
table_a as a
) t1
JOIN (
SELECT
id
FROM
table_b as b
) t2 ON t1.id = t2.id
连接两个表时,Hive SQL 中 where
和 join
有什么区别?
像这样加入
FROM
table_a as a,
table_b as b
WHERE
a.id = b.id;
是一种不好的做法,因为通常情况下,WHERE 在连接后应用并将其转换为 JOIN 并在优化器上推送谓词,以将其转换为正确的连接并避免 CROSS 连接(没有 ON 条件的连接)。
尽可能使用显式 JOIN 和 ON
条件,这样优化器将确定它是一个 JOIN 条件,而且它是 ANSI 语法并且更容易理解。
对于像a.date between b.start and b.end
这样的不相等的连接条件,不可能在 ON 条件下使用,在这种情况下,它们可以移动到 WHERE。在这种情况下,如果您在 ON 条件中没有其他条件,则将使用交叉连接,并且在应用 WHERE 过滤器之后,这种连接会极大地重复 WHERE 过滤器之前的数据并导致性能下降。因此,尽可能始终在 ON 条件下使用显式 ANSI JOIN,始终在 ON 中使用所有相等条件,如果不可能在 ON 中使用它们,则在 WHERE 中仅使用非相等条件。将连接条件保留在 ON
中,仅在 WHERE
中进行过滤。优化器会在可能的情况下将过滤器推送到 JOIN 或连接之前,但最好不要仅依赖优化器,编写易于理解的良好 ANSI sql 并在需要时移植到另一个数据库。
您可以使用 EXPLAIN 命令检查计划中的差异。