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
synchronous
czy asynchronous
w 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_LATENCY
to 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_LATENCY
skonfigurowaną 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 AdventureWorks2012
bazy danych w mojej lokalnej instancji, mogę wyświetlić dane docelowe dla tej sesji i znaleźć przechwycone zapytanie:
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 STOP
sesja, a bufor zostanie w pełni wywołany. Widzę to po zakończeniu sesji:
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_MEMORY
na 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_buffer
cel 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)