Check instantaneous and historical wait types (T-SQL)

Introduction

This script will check wait types and related information. It waits for a minute and then collects historical and instantaneous wait on the server. You can run this script and troubleshoot based on the results.

Scenarios

You can use this script for troubleshooting when you want to check wait in SQL Server. 

Script

You can use this script in this way:

1. Open SQL Server Management Studio (SSMS) and connect SQL Server

2. Copy the code from Wait.sql and run the script.

After the script runs, we’ll get the following figure:


Here are some code snippets for your references. To get the complete script sample, please click the download button at the beginning of this page.

SQL
Edit|Remove
WITH cteWaits1 (wait_type,wait_time_ms,signal_wait_time_ms,resource_wait_time_ms) AS (SELECT wait_type,wait_time_ms,signal_wait_time_ms,resource_wait_time_ms FROM #tblWaits WHERE [retrieval_time] = @minctr), 
    cteWaits2 (wait_type,wait_time_ms,signal_wait_time_ms,resource_wait_time_ms) AS (SELECT wait_type,wait_time_ms,signal_wait_time_ms,resource_wait_time_ms FROM #tblWaits WHERE [retrieval_time] = @maxctr) 
INSERT INTO #tblFinalWaits 
SELECT DISTINCT t1.wait_type, (t2.wait_time_ms-t1.wait_time_ms) / 1000. AS wait_time_s, 
    (t2.signal_wait_time_ms-t1.signal_wait_time_ms) / 1000. AS signal_wait_time_s, 
    ((t2.wait_time_ms-t2.signal_wait_time_ms)-(t1.wait_time_ms-t1.signal_wait_time_ms)) / 1000. AS resource_wait_time_s, 
    100.0 * (t2.wait_time_ms-t1.wait_time_ms) / SUM(t2.wait_time_ms-t1.wait_time_ms) OVER() AS pct, 
    ROW_NUMBER() OVER(ORDER BY (t2.wait_time_ms-t1.wait_time_ms) DESC) AS rn, 
    SUM(t2.signal_wait_time_ms-t1.signal_wait_time_ms) * 1.0 / SUM(t2.wait_time_ms-t1.wait_time_ms) * 100 AS signal_wait_pct, 
    (SUM(t2.wait_time_ms-t2.signal_wait_time_ms)-SUM(t1.wait_time_ms-t1.signal_wait_time_ms)) * 1.0 / (SUM(t2.wait_time_ms)-SUM(t1.wait_time_ms)) * 100 AS resource_wait_pct 
FROM cteWaits1 t1 INNER JOIN cteWaits2 t2 ON t1.wait_type = t2.wait_type 
GROUP BY t1.wait_type, t1.wait_time_ms, t1.signal_wait_time_ms, t1.resource_wait_time_ms, t2.wait_time_ms, t2.signal_wait_time_ms, t2.resource_wait_time_ms 
HAVING (t2.wait_time_ms-t1.wait_time_ms) > 0 
ORDER BY wait_time_s DESC;

Prerequisites

SQL Server 2005 or higher version