例如,
-- 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 SQLwhere和Hive SQL有什么區別?join
uj5u.com熱心網友回復:
像這樣加入
FROM
table_a as a,
table_b as b
WHERE
a.id = b.id;
是一種不好的做法,因為一般來說,WHERE 在加入之后應用并將其轉換為 JOIN 并推送謂詞在優化器上,將其轉換為正確的聯接并避免交叉聯接(沒有 ON 條件的聯接)。
盡可能使用帶條件的顯式 JOIN ON,這樣優化器就會確定它是一個 JOIN 條件,它也是 ANSI 語法,更容易理解。
對于不相等的連接條件,例如a.date between b.start and b.end不能在 ON 條件下使用,在這種情況下,它們可以移動到 WHERE。在這種情況下,如果在ON條件下沒有其他條件,就會使用cross join,在應用WHERE filter之后,這樣的join會極大地重復WHERE filter之前的資料,導致性能下降。因此,如果可能,請始終使用帶有 ON 條件的顯式 ANSI JOIN,始終在 ON 中使用所有相等條件,如果不可能在 ON 中使用它們,則僅在 WHERE 中使用非相等條件。在 中保留連接條件,ON并且僅在 中保留過濾器WHERE。優化器會在可能的情況下將過濾器推送到 JOIN 或加入之前,但最好不要僅依賴優化器,撰寫易于理解的良好 ANSI sql 并在需要時移植到另一個資料庫。
您可以使用 EXPLAIN 命令檢查計劃的差異。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419758.html
標籤:
