監控下列效能計數器與 sys.sysprocesses:
sys.sysprocesses.wait_type = 'ASYNC_IO_COMPLETION' → 等待 I/O 完成,通常源於記憶體不足導致的硬碟讀寫(而非單純磁碟效能問題)。| 類型 | 判斷依據 | 典型成因 |
|---|---|---|
| 外部壓力 | Total Server Memory 明顯下降 | 作業系統或其他程式搶佔記憶體(防毒軟體、備份作業等) |
| 內部壓力 | Total Server Memory ≈ Target Server Memory 且不再增長 | SQL Server 內部需求已達配置上限 |
-- 物理讀取最多的 100 條
SELECT TOP 100 qs.total_physical_reads, qs.execution_count,
qs.total_physical_reads / qs.execution_count AS avg_io,
qt.text, DB_NAME(qt.dbid) AS dbname, qt.objectid
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_physical_reads DESC;
-- 邏輯讀取最多的 100 條
SELECT TOP 100 qs.total_logical_reads, qs.execution_count,
qs.total_logical_reads / qs.execution_count AS avg_io,
qt.text, DB_NAME(qt.dbid) AS dbname
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_logical_reads DESC;
Stolen 記憶體皆由 SQL Server 內部組件(Clerk)申請,查詢 sys.dm_os_memory_clerks 即可定位大戶:
| Clerk 類型 | 用途 | 常見成因與對策 |
|---|---|---|
CACHESTORE_SQLCP | 動態 T-SQL 執行計畫快取 | 程式大量使用動態 SQL → 改用預存程序或參數化查詢提高計畫重用 |
OBJECTSTORE_LOCK_MANAGER | 鎖結構記憶體 | 嚴重阻塞 → 解決阻塞根因(索引缺失、長交易等) |
DBCC FREEPROCCACHE 或升級 64 位元版本。32 位元 SQL Server 預設僅 384 MB,易成瓶頸。三大常見成因:
DBCC FREEPROCCACHE、升級 64 位元。對應 wait_type = SOS_RESERVEDMEMBLOCKLIST 即為等待 Multi-Page 記憶體。
本文整理自實戰筆記,如有遺漏歡迎補充。上篇請見《SQL Server 效能調優:記憶體管理篇(上)》。