Get Disk IO Stats (Detail)
Applicability:
SQL Server 2000: Not Supported
SQL Server 2005: Tested
SQL Server 2008: Tested
SQL Server 2008R2: Tested
SQL Server 2012: Not Tested
Credits:
Author: ChillyDBA
Date: 27 Jun 2012
Description
Retrieves detailed IO statistics for all database files on the server:
Disk Reads
Disk Writes
Disk Read Stall Time (time spend waiting for disk)
Disk Write Stall Time (time spend waiting for disk)
Percentage of Total for all 4 of the above figures.
Code
Function:
DROP FUNCTION dbo.udf_GetIOStats_Detail
GO
CREATE FUNCTION dbo.udf_GetIOStats_Detail ()
RETURNS @udf_IOStats_Detail TABLE
(
DatabaseName SYSNAME,
FileType VARCHAR(10),
DriveLetter CHAR(1),
BytesRead DECIMAL(18,2),
BytesWritten DECIMAL(18,2),
IOStallReadTimeSec DECIMAL(18,2),
IOStallWriteTimeSec DECIMAL(18,2),
PercentageReads DECIMAL(5,2),
PercentageWrites DECIMAL(5,2),
PercentageIOStallReadTime DECIMAL(5,2),
PercentageIOStallWriteTime DECIMAL(5,2)
)
AS
/***************************************************************
Purpose: To retrieve a per-file listing of disk reads/write on
the server since the last restart
The following DMVs are used:
sys.dm_io_virtual_file_stats - contains detailed IO information on a per-file basis
Author: ChillyDBA
History: 27 Jun 2012 - Initial Issue
****************************************************************/
BEGIN
;WITH IO_Stats_Detail
AS
(
SELECT
DB_NAME(mf.database_id) AS DatabaseName,
CASE mf.type_desc
WHEN 'Rows' THEN 'DB'
ELSE 'LOG'
END AS FileType,
mf.physical_name,
LEFT(mf.physical_name, 1) AS DriveLetter,
vfs.num_of_writes AS NumberOfWrites,
vfs.num_of_bytes_written AS BytesWritten,
vfs.io_stall_write_ms AS IOStallWriteMS,
mf.type_desc AS TypeDesc,
vfs.num_of_reads AS NumberOfReads,
vfs.num_of_bytes_read AS BytesRead,
vfs.io_stall_read_ms AS IOStallReadMS,
vfs.io_stall AS IOStall,
vfs.size_on_disk_bytes AS SizeOnDiskBytes
FROM sys.master_files mf
JOIN sys.dm_io_virtual_file_stats(NULL, NULL) vfs
ON mf.database_id=vfs.database_id
AND mf.FILE_ID=vfs.FILE_ID
)
INSERT @udf_IOStats_Detail
(
DatabaseName,
FileType,
DriveLetter,
BytesRead,
BytesWritten,
IOStallReadTimeSec,
IOStallWriteTimeSec,
PercentageReads,
PercentageWrites,
PercentageIOStallReadTime,
PercentageIOStallWriteTime
)
SELECT
DatabaseName,
FileType,
DriveLetter,
BytesRead,
BytesWritten,
IOStallReadMS/1000 AS IOStallReadTimeSec,
IOStallWriteMS/1000 AS IOStallWriteTimeSec,
PercentageReads = RTRIM(CONVERT(DECIMAL(5,2),BytesRead*100.0/(
SELECT SUM(BytesRead)
FROM IO_Stats_Detail
))),
PercentageWrites = RTRIM(CONVERT(DECIMAL(5,2),BytesWritten*100.0/(
SELECT SUM(BytesWritten)
FROM IO_Stats_Detail
))),
PercentageIOStallReadTime = RTRIM(CONVERT(DECIMAL(5,2),IOStallReadMS/1000*100.0/(
SELECT SUM(IOStallReadMS/1000)
FROM IO_Stats_Detail
))),
PercentageIOStallWriteTime = RTRIM(CONVERT(DECIMAL(5,2),IOStallWriteMS/1000*100.0/(
SELECT SUM(IOStallWriteMS/1000)
FROM IO_Stats_Detail
)))
FROM IO_Stats_Detail
ORDER BY BytesWritten + BytesRead DESC
RETURN
END
Test Code:
SELECT * FROM dbo.udf_GetIOStats_Detail()