[英]Order of execution SQL
這是假設的代碼:
select table2.id,table1.email,table1.status,table2.status,table2.term,table4.description
From Table1
Join Table 2 ON table1.id = table2.id
Join Table 3 ON table1.id = table3.id
Left Join table4 on table4.num = table2.num
Where Concat(table2.id,(Concat(table2.year,table2.term))
IN(Select Max(Concat(id,( Concat(year,term))))
From table5
Group by id)
And field1 !='abc'
And field2 !='def'
And field3 !='jkl'
Order By status,id
我想知道這是怎么發生的。 (內部)聯接將同時運行,並創建一個虛擬表,該虛擬表又將與表#4聯接……然后將where子句應用於最終結果集? 這是正確的嗎?
連接的順序取決於DBMS的優化器,該優化器考慮了表統計信息,並按照從最有選擇到最有選擇性的WHERE子句的順序來對表進行連接。 這樣,由於我們僅掃描對我們重要的數據,因此效率更高。 像Oracle這樣的DMBS允許您指定顯式排序,例如ORDERED提示,以繞過優化程序的排序選擇。
您的問題分為兩部分。 一個是如何join
S被編譯器解釋,二是他們是如何執行。
出於解釋目的,查詢是(我只是更改了縮進以強調解釋的順序):
From ( ( (Table1 Join
Table2
ON table1.id = table2.id
) Join
Table 3
ON table1.id = table3.id
) Left Join
table4
on table4.num = table2.num
)
也就是說,將結果集確定為好像是按以下順序進行的:
這種解釋與實際執行無關。 SQL引擎確定聯接的最佳順序。 這取決於表的大小,索引的可用性以及where
子句過濾的影響。
在MySQL中,您可以使用子查詢來強制排序。 這也具有實現中間結果的副作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.