天天看點

【MS SQL】通過執行計劃來分析SQL性能

如何知道一句SQL語句的執行效率呢,隻知道下面3種:

1、通過SQL語句執行時磁盤的活動量(IO)資訊來分析:SET STATISTICS IO ON (開啟) / SET STATISTICS IO OFF (關閉)

2、通過SQL語句執行時文法分析、編譯以及執行所消耗的時間:SET STATISTICS TIME ON (開啟) / SET STATISTICS TIME OFF (關閉)

3、通過執行計劃檢視:Ctrl + L

 ----------------------------------------------------------------------------------------------------------------------------------------------------

首先有個表,表的資料不多,是以執行結果比較起來可能不會太明顯...

【MS SQL】通過執行計劃來分析SQL性能

1、先執行 SET STATISTICS IO ON & SET STATISTICS TIME ON;

【MS SQL】通過執行計劃來分析SQL性能

2、執行查詢語句,選擇"消息"選項頁;為友善檢視,使用了聚合函數、GROUP BY、ORDER BY:

【我們并未查詢表:Worktable,為何會有Worktable的記錄呢,最最最後面有注明。】

【MS SQL】通過執行計劃來分析SQL性能

3、按Ctrl + L 組合鍵,檢視執行計劃:

【MS SQL】通過執行計劃來分析SQL性能

==================================================================================

如何檢視表的設計或SQL語句是否是優化的,這邊以建立索引後執行相同的SQL語句,來比對執行結果。

1、建立索引。(為測試性能而建立,未必适用于真實場景)

【MS SQL】通過執行計劃來分析SQL性能

2、建立索引後執行語句所消耗的時間:

【這邊沒有出現Worktable的記錄,最最最後面有注明。】

【MS SQL】通過執行計劃來分析SQL性能
【MS SQL】通過執行計劃來分析SQL性能

====是不是感覺不到什麼變化?下圖是未建立索引和建立索引相同SQL語句執行效能的對比=====

【MS SQL】通過執行計劃來分析SQL性能

由于測試資料較少,結果并不明顯。

但可以通過掌握 "IO讀取"、"時間開銷"、"執行計劃"的參數變化,對SQL性能進行調優。 

==============================================================

【Worktable】在MSDN說明:  

關系引擎可能需要生成一個工作表以執行 SQL 語句中指定的邏輯操作。工作表是用于儲存中間結果的内部表。

 某些 GROUP BY、ORDER BY 或 UNION查詢中會生成工作表。

 例如,如果 ORDER BY 子句引用了不為任何索引涵蓋的列,則關系引擎可能需要生成一個工作表以按所請求的順序對結果集進行排序。

 工作表有時也用作臨時儲存執行部分查詢計劃所得結果的假脫機。工作表在tempdb中生成,并在不再需要時自動删除。