Visualizzazione dei dati degli eventi estesi di SQL Server


16

Ultimamente ho esplorato l'utilizzo degli eventi estesi in SQL Server per aiutarmi a valutare e ottimizzare varie query. Finora, per visualizzare i dati dell'evento ho utilizzato la funzione "Guarda i dati live" in SSMS.

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:

  1. C'è un modo per aggirare questo ritardo nel far sì che gli eventi vengano visualizzati nel feed live? (Lo sto facendo su un database locale, quindi le prestazioni non sono un problema)
  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?

AGGIORNARE

Come richiesto, ecco la sessione:

CREATE EVENT SESSION [Simple Query Benchmarking] ON SERVER 
ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1)
    ACTION(sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.sql_text)
    WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)) AND [package0].[greater_than_uint64]([duration],(1000)))) 
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=1 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO

Risposte:


15

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 synchronouso asynchronousnel 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_LATENCYun'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_LATENCYopzione 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 AdventureWorks2012database sulla mia istanza locale, posso visualizzare i dati di destinazione per questa sessione e trovare la query acquisita:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

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 STOPla sessione e il buffer verranno spediti completamente. Lo vedo quando interrompo la sessione:

inserisci qui la descrizione dell'immagine

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_MEMORYvalore 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_bufferdestinazione 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)

inserisci qui la descrizione dell'immagine


3
Ottima risposta, molto dettagliata. Unico punto, ed è più un interesse di qualsiasi discussione vera; hai citato Johnathan Kehayias e, sono d'accordo, i suoi corsi Pluralsight valgono il 100% della quota di 1 mese. Tuttavia, ha un blog in cui parla di come odia il bersaglio del Ring Buffer. Era del 2014, quindi forse è cambiato ora ma è stata una lettura interessante: sqlskills.com/blogs/jonathan/…
Kalmino,

1

.Net 4.7.2 ha una correzione per ridurre il ritardo iniziale per la visualizzazione degli eventi quando si utilizza il target live.


2
Potresti fornire un riferimento per supportare la tua risposta? Attualmente la tua risposta non contiene molto con cui andare.
John aka hot2use,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.