Crear una sesión de Extended Events: capturar consultas lentas a archivo y leerlas
SQL ServerRendimientoComando
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;Qué hace
Crea una sesión ligera de Extended Events que escribe en disco las sentencias y llamadas RPC de más de 1 segundo con aplicación, host, usuario, base de datos y texto SQL; convierte los archivos .xel en filas con T-SQL.
Cuándo usarlo
Ante quejas de lentitud intermitente, cuando necesita datos del cliente (app/host) que Query Store no muestra y como sustituto de SQL Trace/Profiler.
Precaución
Un umbral muy bajo (p. ej. 0) llena los archivos rápidamente y añade sobrecarga en un servidor con carga; filtre en el predicado WHERE, no después. La acción sql_text es costosa con alto volumen. La carpeta debe tener permiso de escritura para la cuenta de servicio de SQL Server. duration y cpu_time están en microsegundos. Detenga/elimine la sesión al terminar; con STARTUP_STATE = OFF no se inicia tras un reinicio.