Wizualizacja danych rozszerzonych zdarzeń programu SQL Server

16

Ostatnio korzystam z rozszerzonych zdarzeń w programie SQL Server, aby pomóc mi przeprowadzić analizę porównawczą i zoptymalizować różne zapytania. Do tej pory, aby wyświetlić dane zdarzenia, korzystałem z funkcji „Oglądaj dane na żywo” w SSMS.

Problem, który mam, polega na tym, że wydaje się, że funkcja Live Events korzysta z wewnętrznego bufora, co oznacza, że ​​czasami muszę wykonać zapytanie kilka razy, aby wyświetlić informacje w oknie. Dlatego mam dwuczęściowe pytanie, które należy zadać:

  1. Czy istnieje sposób na obejście tego opóźnienia w wyświetlaniu wydarzeń w kanale na żywo? (Robię to w lokalnej bazie danych, więc wydajność nie stanowi problemu)
  2. Czy transmisja na żywo jest najlepszym sposobem na wizualizację danych zdarzeń rozszerzonych? Czy w SSMS jest inne narzędzie, które nie jest lepiej dostosowane do mojego przypadku użycia?

AKTUALIZACJA

Zgodnie z życzeniem, oto sesja:

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
Levi Botelho
źródło

Odpowiedzi:

15

Zastrzeżenie : Wiele z poniższych informacji nauczyłem się ściśle podczas dwóch kursów Pluralsight prowadzonych przez Jonathana Keyhayiasa . Warto miesięczny koszt subskrypcji plus, aby przejść przez jego dwa kursy.

Najpierw kilka ciekawych miejsc, które moim zdaniem pomogą (lub co najwyżej będą interesujące):

  • Po uruchomieniu sesji zdarzenia rozszerzonego część pamięci zostanie przydzielona do obszaru bufora do przechowywania danych wygenerowanych przez zdarzenia sesji. W sesji jest to wartość domyślna 4 MB
  • Dostępnych jest wiele celów. Cele te są albo synchronousczy asynchronousw jaki sposób odbierania danych. Dwa najczęściej używane cele, tj. Plik docelowy i Bufor pierścieniowy, są asynchroniczne. Artykuł BOL tutaj wskazuje, jaki typ jest każdy cel .
  • Jest MAX_DISPATCH_LATENCYto opcja konfiguracji kontrolująca wysyłanie danych zdarzenia do celu (-ów). Wysyłanie występuje tylko dla celów asynchronicznych. Istnieją dwa warunki, które spowodują wysłanie danych zdarzenia: (1) bufor pamięci dla sesji jest pełny lub (2) dane zdarzenia w buforze przekraczają MAX_DISPATCH_LATENCYskonfigurowaną opcję sesji .
  • Po otwarciu Live Data Viewer dołącza dodatkowy cel do sesji zdarzenia o nazwie „target strumieniowy”. Spowoduje to otrzymanie strumienia zdarzeń na żywo podczas wysyłania buforów pamięci. W rzeczywistości zmieni również opóźnienie wysyłki związane z sesją do 3 sekund, aby uzyskać widok sesji zbliżony do czasu rzeczywistego.

Teraz do konkretnych punktów w twoim pytaniu:

Problem, który mam, polega na tym, że wydaje się, że funkcja Live Events korzysta z wewnętrznego bufora, co oznacza, że ​​czasami muszę wykonać zapytanie kilka razy, aby wyświetlić informacje w oknie. Mam zatem dwuczęściowe pytanie

Nie wiem, czy robi to inaczej niż to, co powiedziałem powyżej. Spodziewałbym się, że zdarzenie zostało przechwycone, po prostu nie spełnia ono progów wymaganych do wysłania go do przeglądarki danych na żywo. Przetestowałem to za pomocą następującego zapytania z AdventureWorks2012:

SELECT * FROM dbo.ErrorLog
WAITFOR DELAY '00:00:01' ;
GO

Korzystając z konfiguracji sesji zdarzeń, z wyjątkiem tego, że filtruję tylko w celu przechwytywania danych dla AdventureWorks2012bazy danych w mojej lokalnej instancji, mogę wyświetlić dane docelowe dla tej sesji i znaleźć przechwycone zapytanie:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Ponowne wykonanie tego zapytania w końcu spowoduje jego wywołanie, a przeglądarka danych wyświetli jedno zdarzenie. Teraz, jeśli chcesz zobaczyć wszystkie wyświetlane zdarzenia, po prostu STOPsesja, a bufor zostanie w pełni wywołany. Widzę to po zakończeniu sesji:

wprowadź opis zdjęcia tutaj

1. Czy istnieje sposób na obejście tego opóźnienia w wyświetlaniu wydarzeń w kanale na żywo? (Robię to w lokalnej bazie danych, więc wydajność nie stanowi problemu)

Pomyślałem, że możesz zmienić wartość MAX_MEMORYna niższą, co wskazywałoby na mały rozmiar bufora do przechwytywania zdarzeń. Jednak najniższą wartością, jaką można ustawić w programie SQL Server 2012, jest to 200KB, że użyte zapytanie nie spełnia tego limitu, co powoduje jego natychmiastowe wysłanie. Jedyne, co mogłem zrobić, to co najwyżej wykonać zapytanie, które spowodowałoby dotarcie do bufora i wysłanie poprzednich przechwyconych zdarzeń:

SELECT *
FROM Person.Person
ORDER BY EmailPromotion DESC;

2. Czy transmisja na żywo jest najlepszym sposobem na wizualizację danych zdarzeń rozszerzonych? Czy w SSMS jest inne narzędzie, które nie jest lepiej dostosowane do mojego przypadku użycia?

Nie, że jestem tego świadomy. Sugerowałbym, że najlepszą metodą pobierania danych, gdy tylko się pojawi, jest zapytanie XML o ring_buffercel i po prostu go zniszczyć. Mogę powtórzyć powyższy przykład i jak tylko wykonam poniższe zapytanie, zobaczę zdarzenie.

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

wprowadź opis zdjęcia tutaj


źródło
3
Świetna odpowiedź, bardzo szczegółowa. Tylko wskaż, a to bardziej interesuje niż jakakolwiek prawdziwa dyskusja; wspomniałeś o Johnathanie Kehayiasie i, zgadzam się, jego kursy Pluralsight są w 100% warte 1 miesięcznej opłaty. Ma jednak blog, w którym opowiada o tym, jak nienawidzi celu bufora pierścieniowego. To było od 2014 roku, więc może to się teraz zmieniło, ale był ciekawy odczyt: sqlskills.com/blogs/jonathan/…
Kalmino
1

.Net 4.7.2 ma poprawkę, która zmniejsza początkowe opóźnienie wyświetlania zdarzeń podczas używania celu na żywo.

David Shiflet
źródło
2
Czy możesz podać odniesienie na poparcie swojej odpowiedzi? Obecnie twoja odpowiedź nie zawiera zbyt wiele.
John aka hot2use