在MSSQL中,查看較慢語句的執行計劃,就是一個比較直觀的方式, 如果查看執行計劃呢: 1.從右到左,從上到下的順序閱讀執行計劃2.執行計劃中每個圖標代表一個運算符,總開銷為100%3.數據從右向左在兩個操作符之間流動,由一個連接箭頭表示。4.操作符之間連接箭頭的寬度是傳輸行數的圖形表示。5.同一列 ...
在MSSQL中,查看較慢語句的執行計劃,就是一個比較直觀的方式,
如果查看執行計劃呢:
1.從右到左,從上到下的順序閱讀執行計劃
2.執行計劃中每個圖標代表一個運算符,總開銷為100%
3.數據從右向左在兩個操作符之間流動,由一個連接箭頭表示。
4.操作符之間連接箭頭的寬度是傳輸行數的圖形表示。
5.同一列的兩個操作符之間的連接機制將是嵌套的迴圈連接,Hash 匹配或者合併連接。
- 識別執行計劃中開銷較大的步驟
- 關註較高開銷的節點,一般是表掃描、假離線、排序等運算(如上列中的排序)
b.查看節點之間連接箭頭的寬度。
箭頭的寬度代表傳輸的數據量大小。
分析箭頭左邊的節點為什麼需要這麼多行,是否可以過濾。
檢查箭頭的屬性,實際的行與估計的行相差很大可能是統計信息過時。
c.尋找hash連接操作。對於小的結果集,嵌套的迴圈連接通常是首選的連接 技術。
d.尋找書簽查找操作。大結果集的書簽操作可能造成大量的邏輯讀。
e.尋找執行排序操作的步驟。這表明數據沒有以正確的排序進行檢索。
- 分析索引有效性
a.數據檢索操作
通過查看執行計劃中該表的數據檢索機制,來判斷對該表的查詢是否高效。
- 查找優於掃描。
- RID查找與鍵查找
鍵查找優於rid查找,建議對錶都加上聚集索引
- 分析連接有效性
a. Hash連接
Hash連接有兩個輸入—建立輸入和探查輸入。較小數據量的做為建立輸入。
在建立階段,建立輸入被掃描或計算,併在記憶體中建立hash表,每個行根據計算的hash鍵值被插入的hash表元中。
在探查階段,對於每個探查行計算hash鍵值;與hash表元進行匹配。
b. 合併連接
如果連接輸入列上已經排序,優化器會為其選擇合併連接,合併連接比 Hash匹配更快。
查詢優化器使用hash連接高效處理大的、未排序、沒有索引的輸入。
c.嵌套迴圈連接
嵌套迴圈連接使用一個連接作為外部輸入表,另一個作為內部輸入表。
外部迴圈逐行掃描外部輸入表,內部迴圈為每一個外部行執行一次,搜索匹 配行。
如果外部輸入數據量較小,內部輸入大但有索引,嵌套迴圈連接時非常有效的。