Avvertenza : gran parte delle informazioni fornite di seguito ho appreso rigorosamente da due corsi Pluralsight di Jonathan Keyhayias . Vale la pena la spesa di un mese per l'abbonamento plus per passare attraverso i suoi due corsi.
Innanzitutto solo alcuni punti di interesse che penso possano aiutare (o al massimo essere di interesse):
- Quando viene avviata una sessione di eventi estesa, verrà allocata una parte della memoria in uno spazio buffer per memorizzare i dati generati dagli eventi della sessione. Nella tua sessione questo è impostato sul valore predefinito di 4 MB
- Sono disponibili più target da utilizzare. Questi obiettivi sono
synchronous
o asynchronous
nel modo in cui ricevono i dati. I due target più comunemente utilizzati come Target File e Ring Buffer sono entrambi asincroni. L'articolo BOL qui indica il tipo di ciascun target .
- È
MAX_DISPATCH_LATENCY
un'opzione di configurazione che controlla quando i dati dell'evento vengono inviati ai target. L'invio avviene solo per target asincroni. Esistono due condizioni che causano l'invio dei dati dell'evento: (1) il buffer di memoria per la sessione è pieno o (2) i dati dell'evento nel buffer superano l' MAX_DISPATCH_LATENCY
opzione configurata della sessione .
- Quando si apre Live Data Viewer, verrà allegata una destinazione aggiuntiva alla sessione dell'evento denominata "destinazione streaming". Questo riceverà il flusso di eventi live mentre vengono inviati buffer di memoria. In realtà cambierà anche la latenza di invio associata alla sessione a 3 secondi al fine di avvicinarsi alla vista in tempo reale della sessione.
Ora ai punti specifici della tua domanda:
Il problema che sto riscontrando è che sembra che la funzione Eventi dal vivo utilizzi un buffer interno, il che significa che a volte ho bisogno di eseguire una query più volte per ottenere le sue informazioni da visualizzare nella finestra. Pertanto ho una domanda in due parti da porre
Non sono consapevole che lo fa diversamente da quello che ho affermato sopra. Mi aspetto che l'evento sia stato catturato, semplicemente non ha raggiunto le soglie richieste per essere inviato al tuo visualizzatore di dati live. Ho provato questo con la seguente query da AdventureWorks2012
:
SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO
Utilizzando la configurazione della sessione dell'evento, ad eccezione del fatto che sto filtrando per acquisire solo i dati per il AdventureWorks2012
database sulla mia istanza locale, posso visualizzare i dati di destinazione per questa sessione e trovare la query acquisita:
L'esecuzione di questa query ancora una volta provoca la spedizione e il visualizzatore di dati visualizza un evento. Ora, se in realtà vuoi vedere tutti gli eventi che vengono visualizzati, semplicemente STOP
la sessione e il buffer verranno spediti completamente. Lo vedo quando interrompo la sessione:
1. Esiste un modo per aggirare questo ritardo nel visualizzare gli eventi nel feed live? (Lo sto facendo su un database locale, quindi le prestazioni non sono un problema)
Pensavo che potessi cambiare il MAX_MEMORY
valore in un valore più basso che indicherebbe una piccola dimensione del buffer per acquisire eventi. Tuttavia, il valore più basso su cui è possibile impostare questo è in SQL Server 2012 200KB
, che la query che ho usato non soddisfa quel limite per causarne l'invio immediato. L'unica cosa che potevo fare era al massimo eseguire una query che causasse il raggiungimento del buffer e la spedizione degli eventi precedenti catturati:
SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;
2.Il feed live è il modo migliore per visualizzare i dati degli eventi estesi? Esiste un altro strumento in SSMS o non è meglio adattato al mio caso d'uso?
Non che ne sia a conoscenza al momento. Vorrei suggerire che il metodo migliore per ottenere i dati non appena si verifica è interrogare l'XML per la ring_buffer
destinazione e distruggerli. Posso ripetere l'esempio sopra e non appena eseguo la query qui sotto vedo l'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)