SQL Server: Schnell sehen was die Instanz gerade tut – Echtzeit-Diagnose

In einer Notfallsituation braucht man sofortige Antworten: Was tut der SQL Server gerade? Wer blockiert wen? Welche Query verursacht die CPU-Last? Diese DMV-Queries liefern innerhalb von Sekunden ein vollständiges Bild.

Alle aktuell laufenden Queries

SELECT
    r.session_id,
    r.status,
    r.cpu_time,
    r.total_elapsed_time / 1000 AS elapsed_sec,
    r.logical_reads,
    r.writes,
    r.wait_type,
    DB_NAME(r.database_id) AS database_name,
    t.text AS query_text,
    SUBSTRING(t.text, (r.statement_start_offset/2)+1,
        ((CASE r.statement_end_offset
          WHEN -1 THEN DATALENGTH(t.text)
          ELSE r.statement_end_offset END
          - r.statement_start_offset)/2)+1) AS current_statement
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.session_id > 50  -- System-Sessions ausschließen
ORDER BY r.total_elapsed_time DESC;

Blockierungsketten erkennen

-- Blocking-Chains: Wer blockiert wen?
SELECT
    blocked.session_id AS blocked_session,
    blocking.session_id AS blocking_session,
    blocked.wait_type,
    blocked.wait_time / 1000.0 AS wait_sec,
    DB_NAME(blocked.database_id) AS db,
    bt.text AS blocking_query
FROM sys.dm_exec_requests blocked
JOIN sys.dm_exec_sessions blocking ON blocked.blocking_session_id = blocking.session_id
CROSS APPLY sys.dm_exec_sql_text(blocking.sql_handle) bt
WHERE blocked.blocking_session_id > 0;

Top CPU-Verbraucher

-- Top 10 Queries nach CPU (aus dem Plan Cache)
SELECT TOP 10
    total_cpu_time = qs.total_worker_time / 1000,
    avg_cpu_time = qs.total_worker_time / qs.execution_count / 1000,
    execution_count = qs.execution_count,
    query_text = SUBSTRING(qt.text, qs.statement_start_offset/2+1,
        (CASE WHEN qs.statement_end_offset = -1
              THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
              ELSE qs.statement_end_offset END - qs.statement_start_offset)/2+1)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_worker_time DESC;

Diese drei Queries decken die häufigsten Notfallsituationen ab: überlastete Instanz, Blockierungen und CPU-Spitzen. Sie sollten Teil jedes DBA-Toolkits und in SSMS als gespeicherte Favoriten hinterlegt sein.