當懷疑儲存子系統成為瓶頸時,結合 sys.dm_io_pending_io_requests(掛起 I/O 請求)與 sys.dm_io_virtual_file_stats(檔案層級 I/O 統計),可即時定位哪個資料庫、哪個檔案正經歷 I/O 壓力。
SELECT
DB_NAME(vfs.database_id) AS DBName,
vfs.database_id,
vfs.file_id,
vfs.io_stall,
pir.io_pending_ms_ticks,
pir.scheduler_address
FROM sys.dm_io_virtual_file_stats(NULL, NULL) vfs
JOIN sys.dm_io_pending_io_requests pir ON pir.io_handle = vfs.file_handle;
io_stall:累積 I/O 等待毫秒數(讀+寫),高值代表歷史瓶頸。io_pending_ms_ticks:目前掛起請求已等待毫秒數,**即時壓力指標**。scheduler_address:關聯排程器,可進一步連結 sys.dm_os_schedulers 觀察是否有特定 CPU 核心 I/O 排隊。SELECT
DB_NAME(vfs.database_id) AS DBName,
mf.physical_name,
COUNT(*) AS PendingRequestCount,
MAX(pir.io_pending_ms_ticks) AS MaxWaitMs,
AVG(pir.io_pending_ms_ticks) AS AvgWaitMs
FROM sys.dm_io_pending_io_requests pir
JOIN sys.dm_io_virtual_file_stats(NULL, NULL) vfs ON pir.io_handle = vfs.file_handle
JOIN sys.master_files mf ON mf.database_id = vfs.database_id AND mf.file_id = vfs.file_id
GROUP BY vfs.database_id, mf.physical_name
ORDER BY PendingRequestCount DESC;
PendingRequestCount 持續 > 0 且 AvgWaitMs 高,檢查對應磁碟延遲(sys.dm_io_virtual_file_stats 的 io_stall_read_ms/io_stall_write_ms)。PhysicalDisk\Avg. Disk sec/Read/Write 確認硬體層面延遲。