首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 效能調優必備:用 DMV 快速找出高耗 CPU、高 I/O、慢查詢

     編輯:關於SqlServer

核心查詢:sys.dm_exec_query_stats + sys.dm_exec_sql_text

SELECT
    qs.creation_time AS N'語句編譯時間',
    qs.last_execution_time AS N'上次執行時間',
    qs.total_physical_reads AS N'物理讀取總次數',
    qs.total_logical_reads / qs.execution_count AS N'每次邏輯讀次數',
    qs.total_logical_reads AS N'邏輯讀取總次數',
    qs.total_logical_writes AS N'邏輯寫入總次數',
    qs.execution_count AS N'執行次數',
    qs.total_worker_time / 1000 AS N'所用CPU總時間(ms)',
    qs.total_elapsed_time / 1000 AS N'總花費時間(ms)',
    (qs.total_elapsed_time / qs.execution_count) / 1000 AS N'平均時間(ms)',
    SUBSTRING(st.text,
        (qs.statement_start_offset/2) + 1,
        (CASE qs.statement_end_offset
            WHEN -1 THEN DATALENGTH(st.text)
            ELSE qs.statement_end_offset
         END - qs.statement_start_offset)/2 + 1
    ) AS N'執行語句'
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
WHERE SUBSTRING(st.text,
        (qs.statement_start_offset/2) + 1,
        (CASE qs.statement_end_offset
            WHEN -1 THEN DATALENGTH(st.text)
            ELSE qs.statement_end_offset
         END - qs.statement_start_offset)/2 + 1
    ) NOT LIKE '%fetch%'
ORDER BY qs.total_elapsed_time / qs.execution_count DESC;

欄位解讀與排序策略

排序依據適合找出說明
total_worker_time DESC高 CPU 查詢累積 CPU 時間最長,可能為計算密集型或計畫不佳
total_logical_reads DESC高 I/O 查詢邏輯讀最多,通常缺索引或掃描過大範圍
total_elapsed_time / execution_count DESC單次最慢查詢平均耗時最久,使用者體感最差
execution_count DESC高頻查詢執行次數最多,微優化效益最大

進階:加入查詢計畫與資料庫名稱

SELECT
    qs.*,
    DB_NAME(st.dbid) AS DatabaseName,
    OBJECT_NAME(st.objectid, st.dbid) AS ObjectName,
    qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_worker_time DESC;

query_plan 欄位為 XML,點擊可在 SSMS 直接開啟圖形化執行計畫。

注意事項

  • DMV 內容隨服務重啟重置,僅反映目前啟動以來的統計。
  • 參數化查詢會合併統計;動態 SQL 每條不同文本獨立統計。
  • 搭配 sys.dm_exec_cached_plans 可進一步分析計畫重用率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved