[英]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的第二個選項(盡管它可能取決於條件本身)。
加入之前,t3.c4條件很可能會推入t3結果中。
有關Spark如何處理它的更多信息,請參見
SPARK-12532 Jira票證和相關的
請求請求 。
似乎上述更改被延遲了,並且沒有合並到1.6中。
至於聯接的順序,據我所知,有一個計划添加一個基於成本的優化器,以實際計划應該先執行哪個聯接,但是尚未實現。
目前,我只能找到這張SPARK-12602 Jira票證,其中提到了外部/內部聯接重新排序(對於其他情況,還有一些其他票證)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.