資料庫的語句執行順序(必看)
阿新 • • 發佈:2019-02-16
Author:王勤為
1.問題:如下2條語句的具體執行順序是什麼呢,有什麼區別,哪條語句效率更高?
(1).select * from tb1 a join tb2 b on a.id=b.idwhere 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,並返回給呼叫者。