SQL Server 2005+ 提供 DMV/DMF 監控伺服器狀態,主要分類:
| 前綴 | 監控領域 | 典型用途 |
|---|---|---|
| dm_db_* | 資料庫與物件 | 索引使用率、檔案空間、資料庫鏡像 |
| dm_exec_* | 查詢執行與連接 | 緩存計畫、執行統計、工作階段資訊 |
| dm_os_* | 作業系統層級 | 記憶體、排程器、等待統計、閂鎖 |
| dm_tran_* | 交易與隔離 | 作用中交易、鎖定、版本存放區 |
| dm_io_* | I/O 活動 | 檔案統計、掛起 I/O、磁碟延遲 |
SELECT * FROM sys.system_objects
WHERE name LIKE 'dm_%' ORDER BY name;
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;
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;
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;
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;
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%';
UPDATE STATISTICS