SQL優(yōu)化之執(zhí)行順序 總結(jié)
FROM 才是 SQL 語句執(zhí)行的第一步,并非 SELECT 。對(duì)FROM子句中的前兩個(gè)表執(zhí)行笛卡爾積(交叉聯(lián)接),生成虛擬表VT1,獲取不同數(shù)據(jù)源的數(shù)據(jù)集。FROM子句執(zhí)行順序?yàn)閺暮笸?、從右到左,F(xiàn)ROM 子句中寫在最后的表(基礎(chǔ)表 driving table)將被最先處理,即最后的表為驅(qū)動(dòng)表,當(dāng)FROM 子句中包含多個(gè)表的情況下,我們需要選擇數(shù)據(jù)最少的表作為基礎(chǔ)表。
2 ON 應(yīng)用ON過濾器
如果指定了OUTER JOIN保留表中未找到匹配的行將作為外部行添加到虛擬表 VT2,生成虛擬表 VT3。保留表如下:
RIGHT OUTER JOIN 把右表記為保留表
在虛擬表 VT2表的基礎(chǔ)上添加保留表中被過濾條件過濾掉的數(shù)據(jù),非保留表中的數(shù)據(jù)被賦予NULL值,最后生成虛擬表 VT3。
4 WHERE 應(yīng)用WEHRE過濾器
由于數(shù)據(jù)還沒有分組,因此現(xiàn)在還不能在WHERE過濾器中使用聚合函數(shù)對(duì)分組統(tǒng)計(jì)的過濾。同時(shí),由于還沒有進(jìn)行列的選取操作,因此在SELECT中使用列的別名也是不被允許的。
按GROUP BY子句中的列/列表將虛擬表 VT4中的行唯一的值組合成為一組,生成虛擬表VT5。如果應(yīng)用了GROUP BY,那么后面的所有步驟都只能得到的虛擬表VT5的列或者是聚合函數(shù)(count、sum、avg等)。原因在于最終的結(jié)果集中只為每個(gè)組包含一行。
計(jì)算 max 等聚合函數(shù)。SQL Aggregate 函數(shù)計(jì)算從列中取得的值,返回一個(gè)單一的值。常用的 Aggregate 函數(shù)包含以下幾種:
COUNT:返回行數(shù)
LAST:返回最后一個(gè)記錄的值
MIN:返回最小值
對(duì)虛擬表 VT5應(yīng)用ROLLUP或CUBE選項(xiàng),生成虛擬表 VT6。
CUBE 生成的結(jié)果數(shù)據(jù)集顯示了所選列中值的所有組合的聚合。
對(duì)虛擬表VT6應(yīng)用HAVING篩選器。根據(jù)指定的條件對(duì)數(shù)據(jù)進(jìn)行篩選,并把滿足的數(shù)據(jù)插入虛擬表VT7。
將虛擬表 VT7中的在SELECT中出現(xiàn)的列篩選出來,并對(duì)字段進(jìn)行處理,計(jì)算SELECT子句中的表達(dá)式,產(chǎn)生虛擬表 VT8。
10 DISTINCT 行去重
將虛擬表 VT9中的行按ORDER BY 子句中的列/列表排序,生成游標(biāo) VC10 ,注意不是虛擬表。因此使用 ORDER BY 子句查詢不能應(yīng)用于表達(dá)式。同時(shí),ORDER BY子句的執(zhí)行順序?yàn)閺淖蟮接遗判?,是非常消耗資源的。
12 LIMIT/OFFSET 指定返回行
<p helvetica="" neue",="" "pingfang="" sc",="" "hiragino="" sans="" gb",="" "microsoft="" yahei="" ui",="" yahei",="" arial,="" sans-serif;="" letter-spacing:="" 0.544px;="" text-align:="" justify;="" white-space:="" normal;="" background-color:="" rgb(255,="" 255,="" 255);="" box-sizing:="" border-box="" !important;="" overflow-wrap:="" break-word="" !important;"="" style="padding: 0px; margin-top: 0px; margin-bottom: 0px; list-style: none; box-sizing: border-box; outline: 0px; max-width: 100%; clear: both; min-height: 1em; color: rgb(62, 62, 62);">從VC10的開始處選擇指定數(shù)量行,生成虛擬表 VT11,并返回調(diào)用者。








暫無數(shù)據(jù)