利用 sys.dm_exec_query_stats 列出平均耗時、總耗時、CPU、邏輯讀最高的語句:
SELECT
creation_time AS '語句編譯時間',
last_execution_time AS '上次執行時間',
total_physical_reads AS '物理讀取總次數',
total_logical_reads/execution_count AS '每次邏輯讀次數',
total_logical_reads AS '邏輯讀取總次數',
total_logical_writes AS '邏輯寫入總次數',
execution_count AS '執行次數',
total_worker_time/1000 AS '所用CPU總時間ms',
total_elapsed_time/1000 AS '總花費時間ms',
(total_elapsed_time / execution_count)/1000 AS '平均時間ms',
SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS '執行語句'
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
WHERE ... NOT LIKE '%fetch%'
ORDER BY total_elapsed_time / execution_count DESC;
列出各表資料量,結合業務知識找出「查詢量大 + 資料量大」的核心表,再查看磁碟使用情況。
DBCC SHOWCONTIG ('表名')
關鍵指標:
USE [資料庫名];
ALTER INDEX ALL ON [表名稱] REBUILD;
重建後對比:
重跑步驟 1 的查詢,發現大多數語句平均耗時下降接近 50%。前台實測回應明顯加快。
sys.dm_db_index_physical_stats 自動化監控