Créer une session Extended Events : capturer les requêtes lentes dans un fichier et les lire
SQL ServerPerformancesCommande
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.