Requêtes pour voir rapidement ce que fait votre SQL Server EN CE MOMENT

Lors du diagnostic de problèmes de performance sur une instance SQL Server, la première étape est toujours de comprendre ce qui se passe en ce moment : quelles requêtes s’exécutent, quelles sessions en bloquent d’autres, et où le temps est passé à attendre. Ces trois scripts T-SQL vous donnent une image immédiate de la charge de travail actuelle grâce aux Dynamic Management Views (DMVs).

1. Requêtes bloquées et bloquantes

Si cette requête ne retourne aucune ligne, il n’y a pas de requêtes bloquées en ce moment. Exécutez-la plusieurs fois pour attraper des chaînes de blocage de courte durée. Note : cela ne révèle que le blocage actuel — la contention de verrous à court terme cumulative nécessite une analyse des wait stats (voir section 2).

SELECT 'BLOCKING STATUS' AS Controllo,
    BlockedSPID     = LEFT(blocked.session_id, 5),
    BlockedQuery    = CONVERT(VARCHAR(50), blockedsql.text),
    BlockingSPID    = CONVERT(VARCHAR(50), blocking.session_id),
    BlockingQuery   = CONVERT(VARCHAR(50), blockingsql.text)
FROM sys.dm_exec_requests blocked
JOIN sys.dm_exec_requests blocking
    ON blocked.blocking_session_id = blocking.session_id
CROSS APPLY (SELECT * FROM sys.dm_exec_sql_text(blocked.sql_handle))  blockedsql
CROSS APPLY (SELECT * FROM sys.dm_exec_sql_text(blocking.sql_handle)) blockingsql;

2. Analyse des événements d’attente

SQL Server collecte en continu des statistiques d’attente dans sys.dm_os_wait_stats depuis le dernier redémarrage de l’instance. Réinitialiser cette vue et collecter des données sur une courte fenêtre vous donne une image focalisée de ce sur quoi l’instance passe son temps à attendre — I/O, CPU, verrous, latches, et plus encore.

DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR); -- Réinitialiser la DMV
GO

SELECT
    [owt].[session_id],
    [owt].[exec_context_id],
    [owt].[wait_duration_ms],
    [owt].[wait_type],
    [owt].[blocking_session_id],
    [owt].[resource_description],
    [es].[program_name],
    [est].[text],
    [est].[dbid],
    [eqp].[query_plan],
    [es].[cpu_time],
    [es].[memory_usage]
FROM sys.dm_os_waiting_tasks [owt]
INNER JOIN sys.dm_exec_sessions  [es]  ON [owt].[session_id] = [es].[session_id]
INNER JOIN sys.dm_exec_requests  [er]  ON [es].[session_id]  = [er].[session_id]
OUTER APPLY sys.dm_exec_sql_text   ([er].[sql_handle])   [est]
OUTER APPLY sys.dm_exec_query_plan ([er].[plan_handle])  [eqp]
WHERE [es].[is_user_process] = 1;

3. Requêtes actuellement actives

Cette requête retourne toutes les requêtes actuellement en cours d’exécution avec leur texte SQL, leur plan d’exécution, l’utilisation CPU et les attentes actuelles.

SELECT
    r.session_id,
    r.status,
    r.wait_type,
    r.wait_time,
    r.cpu_time,
    r.total_elapsed_time,
    SUBSTRING(st.text, (r.statement_start_offset/2)+1,
        ((CASE r.statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
          ELSE r.statement_end_offset END - r.statement_start_offset)/2)+1) AS statement_text,
    qp.query_plan
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) st
OUTER APPLY sys.dm_exec_query_plan(r.plan_handle) qp
WHERE r.session_id > 50  -- Exclure les processus système
  AND r.session_id != @@SPID
ORDER BY r.total_elapsed_time DESC;