Lists the longest resource waits for a server instance, helping you to locate bottlenecks. Wait statistics are cumulative, and calculated since the last SQL Server restart or statistics reset.

-- Lists the longest resource waits for a server instance, helping you to locate
-- bottlenecks
-- 
-- Wait statistics are cumulative, and calculated since the last SQL Server
-- restart or statistics reset.
-- 
-- SQL Server collects data for many different wait types; refer to SQL Server
-- Books Online for more information about each wait type.
-- 
-- For example, if the top wait types are disk I/O related, you could use
-- Dynamic Management Views (DMVs) such as sys.dm_io_pending_io_requests and
-- sys.dm_io_virtual_file_stats to analyse the problem in more detail.
-- 
-- You can specify a Wait time limit (%) before you run the script (default 1%).
-- Only wait types with values higher than the percentage you specify will be
-- listed.

declare @wait_time_limit int;
set @wait_time_limit = 1;

with Waits
    as (select
            wait_type,
            wait_time_ms / 1000. as wait_time_sec,
            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'))
    select
        wait_type as [Wait Type],
        cast(wait_time_sec as decimal(12, 2)) as [Wait Time (s)],
        cast(pct as decimal(12, 2)) as [Wait Time (%)]
    from Waits
    where pct > @wait_time_limit
    order by
        wait_time_sec desc;