Advertencia : Gran parte de la información proporcionada a continuación la aprendí estrictamente al pasar por dos cursos de Pluralsight de Jonathan Keyhayias . Vale la pena el gasto de un mes por la suscripción plus para completar sus dos cursos.
Primero, solo algunos puntos de interés que creo que ayudarán (o como mucho serán de interés):
- Cuando se inicia una sesión de evento extendido, tendrá una porción de memoria asignada a un espacio de búfer para almacenar datos generados por los eventos de la sesión. En su sesión, esto se establece en el valor predeterminado de 4 MB
- Hay múltiples objetivos disponibles para usar. Estos objetivos son
synchronous
o asynchronous
en la forma en que reciben los datos. Los dos objetivos más utilizados son Target File y Ring Buffer, ambos son asíncronos. El artículo de BOL aquí indica de qué tipo es cada objetivo .
- Esta
MAX_DISPATCH_LATENCY
es una opción de configuración que controla cuándo se envían los datos del evento a los objetivos. El envío solo se produce para objetivos asincrónicos. Hay dos condiciones que harán que se envíen datos de eventos: (1) el búfer de memoria para la sesión está lleno o (2) los datos de eventos en el búfer exceden la MAX_DISPATCH_LATENCY
opción configurada de la sesión .
- Cuando abra el Visor de datos en vivo, adjuntará un objetivo adicional a la sesión del evento denominado "objetivo de transmisión". Esto recibirá la transmisión del evento en vivo a medida que se despachan las memorias intermedias. En realidad, también cambiará la latencia de envío asociada con la sesión a 3 segundos para obtener una vista cercana en tiempo real de la sesión.
Ahora a puntos específicos en su pregunta:
El problema que tengo es que parece que la función Live Events utiliza un búfer interno, lo que significa que a veces necesito ejecutar una consulta varias veces para que su información se muestre en la ventana. Por lo tanto, tengo una pregunta de dos partes para hacer
No soy consciente de que hace esto aparte de lo que dije anteriormente. Esperaría que el evento se haya capturado, simplemente no ha alcanzado los umbrales requeridos para que se envíe a su visor de datos en vivo. Probé esto con la siguiente consulta de AdventureWorks2012
:
SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO
Utilizando la configuración de sesión de evento, con la excepción de que estoy filtrando para capturar solo datos para la AdventureWorks2012
base de datos en mi instancia local, puedo ver los datos de destino para esta sesión y encontrar que la consulta fue capturada:
Ejecutar esta consulta una vez más finalmente hará que se despache y el visor de datos muestre un evento. Ahora, si realmente desea ver todos los eventos que se muestran, simplemente STOP
la sesión y el búfer se distribuirán por completo. Veo esto una vez que detengo mi sesión:
1. ¿Hay alguna forma de evitar este retraso para que los eventos se muestren en la transmisión en vivo? (Estoy haciendo esto en una base de datos local, por lo que el rendimiento no es un problema)
Pensé que podría cambiarlo MAX_MEMORY
a un valor más bajo que indicaría un tamaño de búfer pequeño para capturar eventos. Sin embargo, el valor más bajo en el que puede establecer esto en SQL Server 2012 es 200KB
que la consulta que utilicé no cumple ese límite para que se envíe de inmediato. Lo único que pude hacer fue a lo sumo ejecutar una consulta que haría que se alcanzara el búfer y que se enviaran los eventos anteriores capturados:
SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;
¿Es la transmisión en vivo la mejor manera de visualizar datos de eventos extendidos? ¿Hay otra herramienta en SSMS o no que esté mejor adaptada a mi caso de uso?
No es que yo sepa actualmente. Sugeriría que el mejor método para obtener datos tan pronto como ocurra es consultar el XML para el ring_buffer
objetivo y simplemente eliminarlo. Puedo repetir el ejemplo anterior y tan pronto como ejecuto la consulta a continuación veo el evento.
-- Create XML variable to hold Target Data
DECLARE @target_data XML
SELECT @target_data = CAST([t].[target_data] AS XML)
FROM [sys].[dm_xe_sessions] AS s
JOIN [sys].[dm_xe_session_targets] AS t
ON [t].[event_session_address] = [s].[address]
WHERE [s].[name] = N'Simple Query Benchmarking' AND
[t].[target_name] = N'ring_buffer' ;
-- Return the full XML document
--SELECT @target_data;
--Shred XMl to get needed data
SELECT DATEADD(hh, DATEDIFF(hh, GETUTCDATE(), CURRENT_TIMESTAMP), n.value('(@timestamp)[1]', 'datetime2')) AS [timestamp],
n.value('(data[@name="duration"]/value)[1]', 'bigint') as duration,
n.value('(action[@name="sql_text"]/value)[1]', 'varchar(max)') as sql_text
FROM @target_data.nodes('RingBufferTarget/event[@name=''sql_batch_completed'']') AS q(n)