1. 程式人生 > >資料庫的語句執行順序(必看)

資料庫的語句執行順序(必看)

Author:王勤為

1.問題:如下2條語句的具體執行順序是什麼呢,有什麼區別,哪條語句效率更高?

   (1).select * from tb1 a join tb2 b on a.id=b.id
              where a.time between t11 and t12 and b.time between t21 and t22

   (2).select * from (select * from tb1 where time between t11 and t12) a
             join (select * from tb2 where time between t21 and t22) b on a.id=b.id
 

2.答案:有區別,第二條是先篩選後連線,在資料量很大而且沒有索引的情況下,第二條語句的效率更高,如果有索引,請檢視具體執行計劃再做決定。

3.具體請看一個完整的SQL語句是怎麼執行的吧
執行順序:

(1). FROM:對FROM子句中的前兩個表執行笛卡爾積,生成虛擬表VT1。

(2). ON:對VT1應用ON篩選器。只有那些使<join_condition>為真的行才被插入VT2。

(3). OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行將作為外部行新增到VT2,生成VT3。

如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重複執行步驟1到步驟3,直到


處理完所有的表為止。

(4). 對VT3應用WHERE篩選器。只有使<where_condition>為TRUE的行才被插入VT4。

(5). GROUP BY:按GROUP BY 子句中的列列表對VT4中的行分組,生成VT5。

(6). CUBE|ROLLUP:把超組插入VT5,生成VT6。

(7). HAVING:對VT6應用HAVING篩選器。只有使<having_condition>為TRUE的組才會被插入VT7。

(8). SELECT:處理SELECT列表,產生VT8。

(9). DISTINCT:將重複的行從VT8中移除,產生VT9。

(10). ORDER BY:將VT9中的行按ORDER BY子句中的列列表排序,生成一個有表(VC10)。


(11). TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回給呼叫者。