Statistiques d'attente : ce que le serveur attend
SQL ServerPerformancesCommande
WITH w AS (
SELECT wait_type, waiting_tasks_count,
wait_time_ms / 1000.0 AS wait_s,
(wait_time_ms - signal_wait_time_ms) / 1000.0 AS resource_s,
signal_wait_time_ms / 1000.0 AS signal_s
FROM sys.dm_os_wait_stats
WHERE waiting_tasks_count > 0
AND wait_type NOT LIKE N'SLEEP[_]%'
AND wait_type NOT IN (
N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR', N'BROKER_TASK_STOP', N'BROKER_TO_FLUSH',
N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE', N'CLR_AUTO_EVENT', N'CLR_MANUAL_EVENT',
N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE', N'FT_IFTS_SCHEDULER_IDLE_WAIT',
N'HADR_FILESTREAM_IOMGR_IOCOMPLETION', N'HADR_WORK_QUEUE', N'LAZYWRITER_SLEEP',
N'LOGMGR_QUEUE', N'ONDEMAND_TASK_QUEUE', N'PVS_PREALLOCATE', N'REQUEST_FOR_DEADLOCK_SEARCH',
N'SNI_HTTP_ACCEPT', N'SOS_WORK_DISPATCHER', N'SP_SERVER_DIAGNOSTICS_SLEEP',
N'SQLTRACE_BUFFER_FLUSH', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', N'WAITFOR',
N'XE_DISPATCHER_WAIT', N'XE_TIMER_EVENT', N'XE_LIVE_TARGET_TVF', N'PREEMPTIVE_XE_DISPATCHER',
N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP', N'QDS_ASYNC_QUEUE', N'QDS_SHUTDOWN_QUEUE',
N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP', N'PWAIT_ALL_COMPONENTS_INITIALIZED',
N'PWAIT_EXTENSIBILITY_CLEANUP_TASK', N'STARTUP_DEPENDENCY_MANAGER', N'WAIT_XTP_CKPT_CLOSE')
)
SELECT TOP (20) wait_type, waiting_tasks_count,
CAST(wait_s AS DECIMAL(18,1)) AS wait_s,
CAST(100.0 * wait_s / SUM(wait_s) OVER () AS DECIMAL(5,1)) AS pct,
CAST(resource_s AS DECIMAL(18,1)) AS resource_s,
CAST(signal_s AS DECIMAL(18,1)) AS signal_s,
CAST(1000.0 * wait_s / waiting_tasks_count AS DECIMAL(18,2)) AS avg_wait_ms
FROM w
ORDER BY wait_s DESC;
-- Values accumulate since:
SELECT sqlserver_start_time FROM sys.dm_os_sys_info;
-- User requests waiting right now:
SELECT wt.session_id, wt.wait_type, wt.wait_duration_ms, wt.resource_description, wt.blocking_session_id
FROM sys.dm_os_waiting_tasks wt
JOIN sys.dm_exec_sessions s ON s.session_id = wt.session_id
WHERE s.is_user_process = 1;Ce que fait la commande
Filtre les attentes d'arrière-plan bénignes et ventile le temps d'attente total du serveur par type d'attente avec pourcentage et part resource vs. signal (file CPU) ; montre aussi les requêtes utilisateur en attente à cet instant.
Quand l'utiliser
Comme première étape d'une analyse de performance pour classer le goulot (I/O, CPU, verrou, journal, mémoire, parallélisme) ; pour les comparaisons de référence avant/après.
Attention
Les valeurs sont cumulées depuis le redémarrage ; pour un problème actuel, prenez deux instantanés et comparez le delta. DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR) réinitialise les compteurs pour tout le serveur et perturbe les outils de supervision ; évitez-le. Interprétation : PAGEIOLATCH_* = lectures disque, WRITELOG = disque du journal, LCK_M_* = blocage, CXPACKET/CXCONSUMER = parallélisme, RESOURCE_SEMAPHORE = memory grants, SOS_SCHEDULER_YIELD + signal élevé = pression CPU. Requête en lecture seule ; sûre.
Voir aussi
- Trouver les requêtes les plus coûteuses dans le plan cache (CPU, lectures, durée)
- Lire les interblocages passés depuis la session system_health (deadlock graph)
- Créer une session Extended Events : capturer les requêtes lentes dans un fichier et les lire
- Diagnostiquer la contention et l'utilisation d'espace de tempdb