簡體   English   中英

執行順序SQL

[英]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
    )

也就是說,將結果集確定為好像是按以下順序進行的:

  • 表1至表2
  • 結果到表3
  • 該結果將外部連接到Table4

這種解釋與實際執行無關。 SQL引擎確定聯接的最佳順序。 這取決於表的大小,索引的可用性以及where子句過濾的影響。

在MySQL中,您可以使用子查詢來強制排序。 這也具有實現中間結果的副作用。

暫無
暫無

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

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