SQL 執行順序和效能最佳化

來源:互聯網
上載者:User

一:查詢的邏輯執行順序
 (1) FROM < left_table> 

 (3) < join_type>  JOIN < right_table>   (2) ON < join_condition> 

 (4) WHERE < where_condition> 

 (5) GROUP BY < group_by_list> 

 (6) WITH {cube | rollup}

 (7) HAVING < having_condition> 

 (8) SELECT  (9) DISTINCT (11) < top_specification>  < select_list> 

 (10) ORDER BY < order_by_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 並返回調用者

     

         看到這裡,那麼用過linqtosql的文法有點相似啊?如果我們我們瞭解了sqlserver執行順序,那麼我們就接下來進一步養成日常sql好習慣,也就是在實現功能同時有考慮效能的思想,資料庫是能進行集合運算的工具,我們應該盡量的利用這個工具,所謂集合運算實際就是批量運算,就是盡量減少在用戶端進行大資料量的迴圈操作,而用SQL語句或者預存程序代替。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.