We have a database of 60 Gb the performance of it is very low. I want to find out if there is any IO problem with the server.
I have run the below
WITH DBIO AS
(
SELECT
IVFS.database_id AS db,
CASE WHEN MF.type = 1 THEN 'log' ELSE 'data' END AS file_type,
SUM(IVFS.num_of_bytes_read +IVFS.num_of_bytes_written) AS io,
SUM(IVFS.io_stall) AS io_stall
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS IVFS
JOIN sys.master_files AS MF
ON IVFS.database_id = MF.database_id
AND IVFS.file_id = MF.file_id
GROUP BY IVFS.database_id, MF.type
)
SELECT db, file_type,
CAST(1. *io/ (1024 *1024) AS DECIMAL(12, 2))AS io_mb,
CAST(io_stall /1000. AS DECIMAL(12,2))AS io_stall_s,
CAST(100.*io_stall / SUM(io_stall)OVER()
AS DECIMAL(10,2))AS io_stall_pct,
ROW_NUMBER()OVER(ORDER BY io_stall DESC) AS rn
FROM DBIO
ORDER BY io_stall DESC;
**************************
OUT PUT
db | file_type | io_mb | io_stall_s | io_stall_pct |
16 | data | 327066.7 | 183437.94 | 50.29 |
44 | data | 118815.13 | 66027.05 | 18.1 |
2 | data | 213056.17 | 39963.53 | 10.96 |
38 | data | 13348.57 | 11457.62 | 3.14 |
44 | log | 63006.1 | 10820.08 | 2.97 |
42 | data | 8290.96 | 8362.68 | 2.29 |
43 | data | 21965.2 | 8159.32 | 2.24 |
1 | data | 34257.02 | 7038.57 | 1.93 |
4 | data | 20166.23 | 6837.4 |
WITH Waits AS
(
SELECT
wait_type,
wait_time_ms /1000. AS wait_time_s,
100. * wait_time_ms / SUM(wait_time_ms)OVER()AS pct,
ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS rn
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK'
,'SLEEP_SYSTEMTASK','SQLTRACE_BUFFER_FLUSH','WAITFOR', 'LOGMGR_QUEUE','CHECKPOINT_QUEUE'
,'REQUEST_FOR_DEADLOCK_SEARCH','XE_TIMER_EVENT','BROKER_TO_FLUSH','BROKER_TASK_STOP','CLR_MANUAL_EVENT'
,'CLR_AUTO_EVENT','DISPATCHER_QUEUE_SEMAPHORE', 'FT_IFTS_SCHEDULER_IDLE_WAIT'
,'XE_DISPATCHER_WAIT','SQLTRACE_INCREMENTAL_FLUSH_SLEEP', 'XE_DISPATCHER_JOIN')
)
--filter out additional irrelevant waits
SELECT
W1.wait_type,
CAST(W1.wait_time_s AS DECIMAL(12,2))AS wait_time_s,
CAST(W1.pct AS DECIMAL(12,2))AS pct,
CAST(SUM(W2.pct)AS DECIMAL(12,2))AS running_pct
FROM Waits AS W1
JOIN Waits AS W2
ON W2.rn<= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING SUM(W2.pct)-W1.pct < 90-- percentage threshold
ORDER BY W1.rn;
************************
OUTPUT
wait_type | wait_time_s | pct | running_pct |
LCK_M_S | 31988.02 | 16.23 | 16.23 |
WRITELOG | 22637.25 | 11.49 | 27.72 |
BACKUPBUFFER | 21077.48 | 10.7 | 38.42 |
ASYNC_IO_COMPLETION | 20751.2 | 10.53 | 48.95 |
BACKUPIO | 15845.41 | 8.04 | 57 |
BACKUPTHREAD | 14283.64 | 7.25 | 64.24 |
PAGEIOLATCH_SH | 13400.13 | 6.8 | 71.05 |
OLEDB | 11090.91 | 5.63 | 76.67 |
ASYNC_NETWORK_IO | 8114.44 | 4.12 | 80.79 |
IO_COMPLETION | 7988.63 | 4.05 | 84.85 |
LCK_M_SCH_S | 7455.95 | 3.78 | 88.63 |
SOS_SCHEDULER_YIELD | 6773.13 | 3.44 | 92.07 |
Please help me to drill down to exact problem area.