
Eventos extendidos - trasladar la captura a tabla sql
Publicado por Miguel (4 intervenciones) el 13/05/2024 16:02:35
Buenos días,
Estoy tratando de llevar la información almacenada en ficheros .xel por eventos extendidos de SQL a una tabla en el mismo servidor, de manera tabulada.
Como el proceso demora demasiado traté de efectuar el proceso en lotes con la siguiente consulta, pero el proceso para aproximadamente 1gb, tarda más de 4 horas!!!!
Pueden ser en torno a no más de 200.000 registros....
Tienen alguna recomendación para efectuar este proceso de manera ágil
Gracias a todos y un saludo
DECLARE @BatchSize INT = 10000;
DECLARE @RowCount INT = 1;
WHILE @RowCount > 0
BEGIN
INSERT INTO Test.dbo.Xevents (
event_timestamp, database_name, username, client_hostname, client_app_name, sql_text,
duration, cpu_time, physical_reads, logical_reads, writes, spills, row_count,
last_row_count, line_number, offset, offset_end, statement
, parametrized_plan_handle
)
SELECT TOP (@BatchSize)
CONVERT(xml, event_data).value('(event/@timestamp)[1]', 'smalldatetime') AS event_timestamp,
CONVERT(xml, event_data).value('(event/action[@name="database_name"]/value)[1]', 'nvarchar(max)') AS database_name,
CONVERT(xml, event_data).value('(event/action[@name="username"]/value)[1]', 'nvarchar(max)') AS user_name,
CONVERT(xml, event_data).value('(event/action[@name="client_hostname"]/value)[1]', 'nvarchar(max)') AS client_hostname,
CONVERT(xml, event_data).value('(event/action[@name="client_app_name"]/value)[1]', 'nvarchar(max)') AS client_app_name,
CONVERT(xml, event_data).value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS sql_text,
CONVERT(xml, event_data).value('(event/data[@name="duration"]/value)[1]', 'nvarchar(max)') AS duration,
CONVERT(xml, event_data).value('(event/data[@name="cpu_time"]/value)[1]', 'nvarchar(max)') AS cpu_time,
CONVERT(xml, event_data).value('(event/data[@name="physical_reads"]/value)[1]', 'nvarchar(max)') AS physical_reads,
CONVERT(xml, event_data).value('(event/data[@name="logical_reads"]/value)[1]', 'nvarchar(max)') AS logical_reads,
CONVERT(xml, event_data).value('(event/data[@name="writes"]/value)[1]', 'nvarchar(max)') AS writes,
CONVERT(xml, event_data).value('(event/data[@name="spills"]/value)[1]', 'nvarchar(max)') AS spills,
CONVERT(xml, event_data).value('(event/data[@name="row_count"]/value)[1]', 'nvarchar(max)') AS row_count,
CONVERT(xml, event_data).value('(event/data[@name="last_row_count"]/value)[1]', 'nvarchar(max)') AS last_row_count,
CONVERT(xml, event_data).value('(event/data[@name="line_number"]/value)[1]', 'nvarchar(max)') AS line_number,
CONVERT(xml, event_data).value('(event/data[@name="offset"]/value)[1]', 'nvarchar(max)') AS offset,
CONVERT(xml, event_data).value('(event/data[@name="offset_end"]/value)[1]', 'nvarchar(max)') AS offset_end,
CONVERT(xml, event_data).value('(event/data[@name="statement"]/value)[1]', 'nvarchar(max)') AS statement
, CONVERT(xml, event_data).value('(event/data[@name="parametrized_plan_handle"]/value)[1]', 'nvarchar(max)') AS parametrized_plan_handle
FROM
sys.fn_xe_file_target_read_file(N'c:\sql\Xevents*.xel', NULL, NULL, NULL) AS event_data
WHERE
CONVERT(xml, event_data).value('(event/action[@name="database_name"]/value)[1]', 'nvarchar(max)') NOT IN ('master', 'msdb', 'tempdb', 'model')
AND CONVERT(xml, event_data).value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') <> 'SELECT 1';
SET @RowCount = @@ROWCOUNT;
END;
Estoy tratando de llevar la información almacenada en ficheros .xel por eventos extendidos de SQL a una tabla en el mismo servidor, de manera tabulada.
Como el proceso demora demasiado traté de efectuar el proceso en lotes con la siguiente consulta, pero el proceso para aproximadamente 1gb, tarda más de 4 horas!!!!
Pueden ser en torno a no más de 200.000 registros....
Tienen alguna recomendación para efectuar este proceso de manera ágil
Gracias a todos y un saludo
DECLARE @BatchSize INT = 10000;
DECLARE @RowCount INT = 1;
WHILE @RowCount > 0
BEGIN
INSERT INTO Test.dbo.Xevents (
event_timestamp, database_name, username, client_hostname, client_app_name, sql_text,
duration, cpu_time, physical_reads, logical_reads, writes, spills, row_count,
last_row_count, line_number, offset, offset_end, statement
, parametrized_plan_handle
)
SELECT TOP (@BatchSize)
CONVERT(xml, event_data).value('(event/@timestamp)[1]', 'smalldatetime') AS event_timestamp,
CONVERT(xml, event_data).value('(event/action[@name="database_name"]/value)[1]', 'nvarchar(max)') AS database_name,
CONVERT(xml, event_data).value('(event/action[@name="username"]/value)[1]', 'nvarchar(max)') AS user_name,
CONVERT(xml, event_data).value('(event/action[@name="client_hostname"]/value)[1]', 'nvarchar(max)') AS client_hostname,
CONVERT(xml, event_data).value('(event/action[@name="client_app_name"]/value)[1]', 'nvarchar(max)') AS client_app_name,
CONVERT(xml, event_data).value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS sql_text,
CONVERT(xml, event_data).value('(event/data[@name="duration"]/value)[1]', 'nvarchar(max)') AS duration,
CONVERT(xml, event_data).value('(event/data[@name="cpu_time"]/value)[1]', 'nvarchar(max)') AS cpu_time,
CONVERT(xml, event_data).value('(event/data[@name="physical_reads"]/value)[1]', 'nvarchar(max)') AS physical_reads,
CONVERT(xml, event_data).value('(event/data[@name="logical_reads"]/value)[1]', 'nvarchar(max)') AS logical_reads,
CONVERT(xml, event_data).value('(event/data[@name="writes"]/value)[1]', 'nvarchar(max)') AS writes,
CONVERT(xml, event_data).value('(event/data[@name="spills"]/value)[1]', 'nvarchar(max)') AS spills,
CONVERT(xml, event_data).value('(event/data[@name="row_count"]/value)[1]', 'nvarchar(max)') AS row_count,
CONVERT(xml, event_data).value('(event/data[@name="last_row_count"]/value)[1]', 'nvarchar(max)') AS last_row_count,
CONVERT(xml, event_data).value('(event/data[@name="line_number"]/value)[1]', 'nvarchar(max)') AS line_number,
CONVERT(xml, event_data).value('(event/data[@name="offset"]/value)[1]', 'nvarchar(max)') AS offset,
CONVERT(xml, event_data).value('(event/data[@name="offset_end"]/value)[1]', 'nvarchar(max)') AS offset_end,
CONVERT(xml, event_data).value('(event/data[@name="statement"]/value)[1]', 'nvarchar(max)') AS statement
, CONVERT(xml, event_data).value('(event/data[@name="parametrized_plan_handle"]/value)[1]', 'nvarchar(max)') AS parametrized_plan_handle
FROM
sys.fn_xe_file_target_read_file(N'c:\sql\Xevents*.xel', NULL, NULL, NULL) AS event_data
WHERE
CONVERT(xml, event_data).value('(event/action[@name="database_name"]/value)[1]', 'nvarchar(max)') NOT IN ('master', 'msdb', 'tempdb', 'model')
AND CONVERT(xml, event_data).value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') <> 'SELECT 1';
SET @RowCount = @@ROWCOUNT;
END;
Valora esta pregunta


0