DBAtlas · Atlas d'exploitation des bases de données

Créer une session Extended Events : capturer les requêtes lentes dans un fichier et les lire

SQL ServerPerformances

Commande

SET QUOTED_IDENTIFIER ON;
CREATE EVENT SESSION [dba_long_queries] ON SERVER
ADD EVENT sqlserver.sql_statement_completed (
    ACTION (sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name,
            sqlserver.session_id, sqlserver.sql_text, sqlserver.username, sqlserver.query_hash)
    WHERE (duration >= 1000000 AND sqlserver.is_system = 0)),   -- 1 s (microseconds)
ADD EVENT sqlserver.rpc_completed (
    ACTION (sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name,
            sqlserver.session_id, sqlserver.sql_text, sqlserver.username, sqlserver.query_hash)
    WHERE (duration >= 1000000 AND sqlserver.is_system = 0))
ADD TARGET package0.event_file (SET filename = N'D:\XE\dba_long_queries.xel',
                                    max_file_size = 256, max_rollover_files = 4)
WITH (MAX_MEMORY = 8 MB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
      MAX_DISPATCH_LATENCY = 15 SECONDS, STARTUP_STATE = OFF);

ALTER EVENT SESSION [dba_long_queries] ON SERVER STATE = START;

-- Read:
SELECT x.value('(event/@name)[1]', 'sysname')                                AS event_name,
       x.value('(event/@timestamp)[1]', 'datetime2')                         AS utc_time,
       x.value('(event/data[@name="duration"]/value)[1]', 'bigint') / 1000   AS duration_ms,
       x.value('(event/data[@name="cpu_time"]/value)[1]', 'bigint') / 1000   AS cpu_ms,
       x.value('(event/data[@name="logical_reads"]/value)[1]', 'bigint')     AS logical_reads,
       x.value('(event/action[@name="database_name"]/value)[1]', 'sysname')  AS db,
       x.value('(event/action[@name="client_app_name"]/value)[1]', 'nvarchar(256)') AS app,
       x.value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS sql_text
FROM  (SELECT CAST(event_data AS XML) AS x
       FROM sys.fn_xe_file_target_read_file(N'D:\XE\dba_long_queries*.xel', NULL, NULL, NULL)) t
ORDER BY duration_ms DESC;

-- When done:
-- ALTER EVENT SESSION [dba_long_queries] ON SERVER STATE = STOP;
-- DROP EVENT SESSION [dba_long_queries] ON SERVER;

Ce que fait la commande

Crée une session Extended Events légère qui écrit sur disque les instructions et appels RPC de plus d'une seconde avec l'application, l'hôte, l'utilisateur, la base et le texte SQL ; transforme les fichiers .xel en lignes avec T-SQL.

Quand l'utiliser

Pour les plaintes de lenteur intermittente, quand vous avez besoin de détails client (app/hôte) que Query Store n'affiche pas, et en remplacement de SQL Trace/Profiler.

Attention

Un seuil très bas (par ex. 0) remplit vite les fichiers et ajoute une surcharge sur un serveur chargé ; filtrez dans le prédicat WHERE, pas après coup. L'action sql_text est coûteuse à fort volume. Le dossier doit être accessible en écriture au compte de service SQL Server. duration et cpu_time sont en microsecondes. Arrêtez/supprimez la session une fois terminé ; avec STARTUP_STATE = OFF, elle ne démarre pas après un redémarrage.

Ouvrir dans DBAtlas →

Voir aussi