今天在看Sql Server 2012 的新特性,當看到某一條時,居然發現了 sys.dm_exec_query_stats 系統視圖進行了升級;又由於該試圖一直在用,並且相當的有用,可以說是查找並優化Sql 語句的一大利器。所以,今天特做下記錄。
MSDN 上對 sys.dm_exec_query_stats 視圖的定義:返回 SQL Server 2012 中緩存查詢計划的聚合性能統計信息。緩存計划中的每個查詢語句在該視圖中對應一行,並且行的生存期與計划本身相關聯。在從緩存刪除計划時,也將從該視圖中刪除對應行。
其實說白了,該視圖存放的就是當前所有執行計划的詳細信息,比如某條執行計划共占CPU多少等等。因為該視圖對編譯次數、占用CPU資源總量、執行次數等都進行了詳細的記錄,所以,可以說是優化 DB服務器CPU 的一大利器。
由於該試圖是動態的,所以並一定總是准確,也可能某條執行計划在查詢的時間做了重編譯,得到了偏差的信息等;另外,對於 sys.dm_exec_query_stats 中占用資源最多的,並不一定是有性能問題的,要同時觀察執行次數 和 IO 讀寫等,而對於執行過於頻繁的,則要考慮在程序中加緩存了;該系統試圖不能用作應急優化用,但是日常優化,一定要做一個重要的參考指標。
說了這么久,下面放 優化的SQL :
SELECT s2.dbid, (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 , ( (CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offset) / 2+1)) AS sql_statement, execution_count, plan_generation_num, last_execution_time, total_worker_time, last_worker_time, min_worker_time, max_worker_time, total_physical_reads, last_physical_reads, min_physical_reads, max_physical_reads, total_logical_writes, last_logical_writes, min_logical_writes, max_logical_writes FROM sys.dm_exec_query_stats AS s1 CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2 WHERE s2.objectid is null ORDER BY s1.total_worker_time desc
具體列的含義,請參考文末。
接下來說下 Sql Server 2012 對 sys.dm_exec_query_stats 試圖的增強功能吧:添加了四列,以幫助排除長時間運行的查詢所存在的問題。可以使用 total_rows、min_rows、max_rows 和 last_rows 聚合行計數列,分隔那些從出現問題的查詢(可能缺少索引或查詢計划出錯)中返回大量行的查詢。
具體意思,從名稱中就不難看出來;經過本人的試用之后,卻發現這個改進對於某些執行計划並不是很實用,為什么呢,因為執行計划是可能接受參數的,所以行數的數量和參數密切相關,所以,對於返回行數和參數密切相關的執行計划,這個改進沒有什么用,反之,還是有一定參考作用的。
sys.dm_exec_query_stats 的詳細說明:http://msdn.microsoft.com/zh-cn/library/ms189741(v=sql.110).aspx