簡體   English   中英

sql中“內部聯接”和“位置”的操作順序

[英]Order of operations in sql for “inner join” and “where”

我有一個看起來像這樣的查詢

select * from t1 inner join t2 on t1.c1 = t2.c1
                 inner join t3 on t2.c2 = t3.c2
                 inner join t4 on t3.c3 = t4.c3
                 where t3.c4 = value

我有興趣知道操作順序是什么:

(1)將執行所有內部聯接,然后選擇t3.c4 = value的列

(2)代替使用t3進行t3.c4 = value實際上將(首先)使用具有t3.c4 = value表進行t3.c4 = value 也就是說,首先將創建具有t3.c4 = value的臨時表( t3tmp ),然后將執行所有內部聯接,而將使用t3 t3tmp代替t3

考慮在DataFrame上使用解釋方法,或者查看Spark UI,以獲取有關如何優化特定案例的更多知識。


下推傳遞聯接謂詞

應該是Spark 1.6的第二個選項(盡管它可能取決於條件本身)。

\n

加入之前,t3.c4條件很可能會推入t3結果中。 有關Spark如何處理它的更多信息,請參見 SPARK-12532 Jira票證和相關的 請求請求

編輯#1

似乎上述更改被延遲了,並且沒有合並到1.6中。

加入重新排序

至於聯接的順序,據我所知,有一個計划添加一個基於成本的優化器,以實際計划應該先執行哪個聯接,但是尚未實現。

目前,我只能找到這張SPARK-12602 Jira票證,其中提到了外部/內部聯接重新排序(對於其他情況,還有一些其他票證)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM