Skip to content

MSSQL-WAITS-001 · Instance waiting a lot on one resource

Severity Confidence Permission Applies to
High Hint · Confirmed for THREADPOOL / RESOURCE_SEMAPHORE VIEW SERVER STATE (2022+: VIEW SERVER PERFORMANCE STATE) SQL Server 2017+, Azure SQL MI, RDS, Azure SQL Database

What it checks

sys.dm_os_wait_stats, counting only waits with a clear meaning (idle and background waits are never counted), grouped by what they mean. A category is reported when it is at least 20% of those waits (min_share_pct) and the instance spent at least 5 minutes waiting on it per hour of uptime (min_wait_s_per_hour: 300).

On Azure SQL Database it reads sys.dm_db_wait_stats (this database only) and also counts the service tier's log write limit (*LOG_RATE_GOVERNOR): if it dominates, the tier is too small for the write load.

What each wait usually means

Meaning Wait types Usual causes
Disk: reading data pages PAGEIOLATCH_* Too little memory for the working set, missing indexes causing scans, slow storage
Disk: transaction log writes WRITELOG Slow log disk, many tiny transactions (commit per row)
Blocking LCK_M_* Long transactions, missing indexes on updates, isolation level
Page contention in memory PAGELATCH_* TempDB allocation contention, last-page insert hotspots
CPU pressure SOS_SCHEDULER_YIELD Expensive queries, too few CPUs
Parallelism CXPACKET, CXCONSUMER MAXDOP / cost threshold at defaults, skewed parallel plans
Memory grants RESOURCE_SEMAPHORE Queries asking for huge sort/hash memory, bad estimates
Out of worker threads THREADPOOL Blocking chains, too many parallel queries. Serious: new connections may fail
Application reading slowly ASYNC_NETWORK_IO Application processing rows one by one, or the network

Next action

Start from the top category and its usual causes. Compare with MSSQL-TOPQUERY-001 and MSSQL-BLOCKING-001 in the same report.

Limitations

Totals accumulate since the restart. They show the long-term profile, not what is happening now; only the difference between two moments shows the present.