1. 程式人生 > >從join on和where執行順序認識T-SQL查詢處理執行順序

從join on和where執行順序認識T-SQL查詢處理執行順序

SQL語句中join連表時on和where後都可以跟條件,那麼對查詢結果集,執行順序,效率是如何呢?
通過查詢資料發現:
區別:
on是對中間結果進行篩選,where是對最終結果篩選。
執行順序:
先進行on的過濾, 而後才進行join。
效率:
如果是inner join, 放on和放where產生的結果一樣, 但沒說哪個效率速度更高? 如果有outer join (left or right), 就有區別了, 因為on生效在先, 已經提前過濾了一部分資料, 而where生效在後.
最後來了解下T-SQL對查詢邏輯處理。
T-SQL邏輯查詢的各個階段:
(5)SELECT DISTINCT TOP(<top_specification>) <select_list>                      

(1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate> 

(2)WHERE <where_predicate>

(3)GROUP BY <group_by_specification>

(4)HAVING <having_predicate>

(6)ORDER BY <order_by_list>
T-SQL在查詢各個階級分別幹了什麼:

(1)FROM 階段

    FROM階段標識出查詢的來源表,並處理表運算子。在涉及到聯接運算的查詢中(各種join),主要有以下幾個步驟:

  a.求笛卡爾積。不論是什麼型別的聯接運算,首先都是執行交叉連線(cross join),求笛卡兒積,生成虛擬表VT1-J1。

      b.ON篩選器。這個階段對上個步驟生成的VT1-J1進行篩選,根據ON子句中出現的謂詞進行篩選,讓謂詞取值為true的行通過了考驗,插入到VT1-J2。

      c.新增外部行。如果指定了outer join,還需要將VT1-J2中沒有找到匹配的行,作為外部行新增到VT1-J2中,生成VT1-J3。

    經過以上步驟,FROM階段就完成了。概括地講,FROM階段就是進行預處理的,根據提供的運算子對語句中提到的各個表進行處理(除了join,還有apply,pivot,unpivot)

(2)WHERE階段

     WHERE階段是根據<where_predicate>中條件對VT1中的行進行篩選,讓條件成立的行才會插入到VT2中。

(3)GROUP BY階段

      GROUP階段按照指定的列名列表,將VT2中的行進行分組,生成VT3。最後每個分組只有一行。

(4)HAVING階段

      該階段根據HAVING子句中出現的謂詞對VT3的分組進行篩選,並將符合條件的組插入到VT4中。

(5)SELECT階段

  這個階段是投影的過程,處理SELECT子句提到的元素,產生VT5。這個步驟一般按下列順序進行

        a.計算SELECT列表中的表示式,生成VT5-1。

        b.若有DISTINCT,則刪除VT5-1中的重複行,生成VT5-2

        c.若有TOP,則根據ORDER BY子句定義的邏輯順序,從VT5-2中選擇簽名指定數量或者百分比的行,生成VT5-3

(6)ORDER BY階段

     根據ORDER BY子句中指定的列明列表,對VT5-3中的行,進行排序,生成遊標VC6.

One example for the inner join and where condition

select coulumns from table_01 inner join table_02 on 01.col1=02.col2 where 01 = 'A' and 02='B' with ur ;

from the db2 plan it will Optimized Statement like below  which remove the join on condition and using where replace it :

select coulumns from table_01 , table_02  where 01 = 'A' and 02='B'  and 01.col1=02.col2 with ur ;

上面優化後的sql 未必是最佳的 ,有可能程式index 會用不到的 。

================華麗分割線 ==============

亮瞎眼