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

SQL Server 運行狀態監控實戰 (一):DMV 架構與 CPU 瓶頸核心診斷查詢

     編輯:關於SqlServer

動態管理視圖 (DMV) 分類總覽

SQL Server 2005+ 提供 DMV/DMF 監控伺服器狀態,主要分類:

前綴監控領域典型用途
dm_db_*資料庫與物件索引使用率、檔案空間、資料庫鏡像
dm_exec_*查詢執行與連接緩存計畫、執行統計、工作階段資訊
dm_os_*作業系統層級記憶體、排程器、等待統計、閂鎖
dm_tran_*交易與隔離作用中交易、鎖定、版本存放區
dm_io_*I/O 活動檔案統計、掛起 I/O、磁碟延遲

查詢所有 DMV/DMF 名稱

SELECT * FROM sys.system_objects 
WHERE name LIKE 'dm_%' ORDER BY name;

CPU 瓶頸核心診斷查詢集

1. 總 CPU 消耗最高的 50 個查詢計畫

SELECT TOP 50
    SUM(qs.total_worker_time) AS total_cpu_time,
    SUM(qs.execution_count) AS total_execution_count,
    COUNT(*) AS number_of_statements,
    qs.sql_handle
FROM sys.dm_exec_query_stats AS qs
GROUP BY qs.sql_handle
ORDER BY SUM(qs.total_worker_time) DESC;

2. 含 SQL 文本的 CPU 總消耗排行

SELECT 
    total_cpu_time, 
    total_execution_count, 
    number_of_statements, 
    s2.text
FROM (
    SELECT TOP 50
        SUM(qs.total_worker_time) AS total_cpu_time,
        SUM(qs.execution_count) AS total_execution_count,
        COUNT(*) AS number_of_statements,
        qs.sql_handle
    FROM sys.dm_exec_query_stats AS qs
    GROUP BY qs.sql_handle
    ORDER BY SUM(qs.total_worker_time) DESC
) AS stats
CROSS APPLY sys.dm_exec_sql_text(stats.sql_handle) AS s2;

3. 平均 CPU 消耗最高的 50 條 SQL 陳述式

SELECT TOP 50
    total_worker_time/execution_count AS [Avg CPU Time],
    (SELECT SUBSTRING(text, statement_start_offset/2,
        (CASE WHEN statement_end_offset = -1 
            THEN LEN(CONVERT(NVARCHAR(MAX), text)) * 2 
            ELSE statement_end_offset END) - statement_start_offset)/2
     FROM sys.dm_exec_sql_text(sql_handle)) AS query_text,
    *
FROM sys.dm_exec_query_stats
ORDER BY [Avg CPU Time] DESC;

4. 找出最高 CPU 累計消耗的查詢計畫詳細資訊

SELECT 
    highest_cpu_queries.plan_handle, 
    highest_cpu_queries.total_worker_time, 
    q.dbid, q.objectid, q.number, q.encrypted, q.[text]
FROM (
    SELECT TOP 50 qs.plan_handle, qs.total_worker_time
    FROM sys.dm_exec_query_stats qs
    ORDER BY qs.total_worker_time DESC
) AS highest_cpu_queries
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS q
ORDER BY highest_cpu_queries.total_worker_time DESC;

5. 尋找高 CPU 運算子的可疑查詢計畫 (Hash Match、Sort)

SELECT * FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
WHERE CAST(query_plan AS NVARCHAR(MAX)) LIKE '%Sort%'
   OR CAST(query_plan AS NVARCHAR(MAX)) LIKE '%Hash Match%';

效能低落查詢計畫處理流程

  1. 識別高 CPU 查詢 (上述查詢)
  2. 對涉及資料表執行 UPDATE STATISTICS
  3. 觀察問題是否解決
  4. 若持續存在,收集資料回報支援團隊
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved