當我看到sql執行很慢的時候就在想為什麼這麼慢? 不外乎數據大,sql語句複雜,沒有索引。 如果要進行優化的話可以從對應的這三個問題出發: 看看表是否可以進行拆分成小表,拆分sql語句,建立適合的索引。 還有查看sql server官方API文檔,瞭解sql的關鍵字執行順序,瞭解執行順序後才能更好的 ...
當我看到sql執行很慢的時候就在想為什麼這麼慢?
不外乎數據大,sql語句複雜,沒有索引。
如果要進行優化的話可以從對應的這三個問題出發:
看看表是否可以進行拆分成小表,拆分sql語句,建立適合的索引。
還有查看sql server官方API文檔,瞭解sql的關鍵字執行順序,瞭解執行順序後才能更好的對sql進行拆分或者優化。
關於sql執行順序
標準的SQL 的解析順序為:參考文章
查詢的邏輯執行順序:
(1) FROM < left_table> (2) ON < join_condition> (3) < join_type> JOIN < right_table> (4) WHERE < where_condition> (5) GROUP BY < group_by_list> (6) WITH {cube | rollup} (7) HAVING < having_condition> (8) SELECT (9) DISTINCT (10) ORDER BY < order_by_list> (11) < top_specification> < select_list>
標準的SQL 的解析順序為:
(1).FROM 子句 組裝來自不同數據源的數據
(2).WHERE 子句 基於指定的條件對記錄進行篩選
(3).GROUP BY 子句 將數據劃分為多個分組
(4).使用聚合函數進行計算
(5).使用HAVING子句篩選分組
(6).計算所有的表達式
(7).使用ORDER BY對結果集進行排序
執行順序:
1.FROM:對FROM子句中前兩個表執行笛卡爾積生成虛擬表vt1
2.ON:對vt1表應用ON篩選器只有滿足< join_condition> 為真的行才被插入vt2
3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2 生成t3如果from包含兩個以上表則對上一個聯結生成的結果表和下一個表重覆執行步驟和步驟直接結束
4.WHERE:對vt3應用 WHERE 篩選器只有使< where_condition> 為true的行才被插入vt4
5.GROUP BY:按GROUP BY子句中的列列表對vt4中的行分組生成vt5
6.CUBE|ROLLUP:把超組(supergroups)插入vt6 生成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 並返回調用者
參考文章:拆分表和拆分sql