Tworzenie sesji zdarzeń z ring_buffer docelowym w pamięci
Dotyczy: usługa Azure SQL Database Azure SQL Managed Instance SQL Database w usłudze Fabric
Ogólne kroki opisane w tym przewodniku to:
- Tworzenie i uruchamianie sesji zdarzeń przy użyciu
ring_buffer
elementu docelowego - Wyświetlanie przechwyconych danych zdarzenia jako xml
- Wyświetlanie przechwyconych danych zdarzenia jako zestawu wierszy relacyjnych
W przypadku obiektu ring_buffer
docelowego kroki są prostsze niż w przypadku event_file
elementu docelowego, ponieważ nie trzeba przechowywać danych zdarzeń w usłudze Azure Storage.
Ten artykuł dotyczy bazy danych SQL fabric, w której wymieniono usługę Azure SQL Database.
Tworzenie i rozpoczynanie sesji zdarzeń przy użyciu obiektu docelowego ring_buffer
Aby utworzyć nową sesję zdarzeń w programie SQL Server Management Studio (SSMS), rozwiń węzeł Zdarzenia rozszerzone. Ten węzeł znajduje się w folderze bazy danych w usłudze Azure SQL Database i w folderze Zarządzanie w usłudze Azure SQL Managed Instance. Kliknij prawym przyciskiem myszy folder Sesje , a następnie wybierz pozycję Nowa sesja.... Na stronie Ogólne wprowadź nazwę sesji, która znajduje się example-session
w tym przykładzie. Na stronie Zdarzenia wybierz co najmniej jedno zdarzenie, które chcesz dodać do sesji. W tym przykładzie sql_batch_starting
wybraliśmy zdarzenie.
Na stronie Magazyn danych wybierz ring_buffer
jako typ docelowy. Aby zaoszczędzić pamięć, zalecamy zachowanie liczby zdarzeń na niewielką liczbę (domyślnie 1000) i ustawienie maksymalnej pamięci buforu na 1 MB lub mniej. Aby uzyskać szczegółowe informacje, zobacz ring_buffer element docelowy.
Po skonfigurowaniu sesji możesz opcjonalnie wybrać przycisk Skrypt , aby utworzyć skrypt języka T-SQL sesji, aby zapisać go później. Oto skrypt dla naszej przykładowej sesji:
CREATE EVENT SESSION [example-session] ON DATABASE
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.ring_buffer(SET max_memory=(1024))
GO
Wybierz przycisk OK , aby utworzyć sesję.
Wyświetlanie danych sesji jako XML
W Eksplorator obiektów rozwiń folder Sesje, aby wyświetlić utworzoną sesję zdarzeń. Domyślnie sesja nie jest uruchamiana po jej utworzeniu. Aby rozpocząć sesję, kliknij prawym przyciskiem myszy nazwę sesji, a następnie wybierz pozycję Rozpocznij sesję. Później możesz go zatrzymać, wybierając podobnie pozycję Zatrzymaj sesję, gdy sesja jest uruchomiona.
Ponieważ partie T-SQL są wykonywane w tej bazie danych lub wystąpieniu zarządzanym, sesja zapisuje zdarzenia w buforze pamięci. Ponieważ rozmiar buforu pamięci jest skończony, po użyciu całej pamięci starsze zdarzenia zostaną odrzucone, aby zapewnić miejsce dla nowszych zdarzeń.
W Eksplorator obiektów rozwiń sesję, aby wyświetlić obiekt docelowypackage0.ring_buffer
, a następnie kliknij dwukrotnie element docelowy. Możesz również kliknąć prawym przyciskiem myszy i wybrać pozycję Wyświetl dane docelowe.... Spowoduje to otwarcie siatki z pokazanym fragmentem XML. Wybierz ten fragment XML, aby wyświetlić dokument XML reprezentujący zawartość buforu pamięci.
W pierwszym wierszu dokumentu XML opisano sesję i metadane docelowe:
<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="17" eventCount="17" droppedCount="0" memoryUsed="32070">
W tym przykładzie widzimy, że 17 zdarzeń zostało przetworzonych przez obiekt docelowy ring_buffer
. Nie usunięto zdarzeń, ponieważ pamięć buforu nie została wyczerpana, a maksymalna liczba skonfigurowanych zdarzeń (1000) nie została osiągnięta.
Napiwek
Zwróć uwagę na truncated
atrybut . Jeśli jest ustawiona wartość 1
, oznacza to, że reprezentacja XML buforu pamięci nie pokazuje całej zawartości buforu. Aby uzyskać więcej informacji, zobacz ring_buffer element docelowy.
Pozostała część dokumentu XML zawiera zdarzenia. Reprezentacja pojedynczego zdarzenia w formacie XML może wyglądać następująco:
<event name="sql_batch_starting" package="sqlserver" timestamp="2023-10-18T17:43:34.079Z">
<data name="batch_text">
<type name="unicode_string" package="package0"></type>
<value><![CDATA[SELECT
'DatabaseXEStore[@Name=' + quotename(CAST(db_name() AS sysname),'''') +' and @ServerName=' + quotename(CAST(SERVERPROPERTY('servername') AS sysname),'''') + ']' AS [Urn],
CAST(db_name() AS sysname) AS [Name],
CAST(SERVERPROPERTY('servername') AS sysname) AS [ServerName],
(SELECT count(*) FROM sys.dm_xe_database_sessions) AS [RunningSessionCount]]]></value>
</data>
</event>
value
Tutaj atrybut zawiera partię T-SQL (pojedyncze zapytanie w tym przykładzie).
Wyświetlanie danych sesji jako relacyjnego zestawu wierszy
Aby wyświetlić dane zdarzenia z ring_buffer
obiektu docelowego w zestawie wierszy relacyjnych, należy napisać zapytanie T-SQL, które używa wyrażeń XQuery do konwertowania kodu XML na dane relacyjne.
Oto przykład sesji, która została utworzona, wyświetlając najpierw najnowsze zdarzenia:
WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST(xst.target_data AS xml) AS TargetData
FROM sys.dm_xe_database_session_targets AS xst
INNER JOIN sys.dm_xe_database_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'example-session'
),
/* A row for each event in the buffer, represented as an XML fragment */
EventNode AS
(
SELECT CAST(NodeData.query('.') AS xml) AS EventInfo
FROM RingBuffer AS rb
CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData)
)
/* A relational rowset formed by using the XQuery value method */
SELECT EventInfo.value('(event/@timestamp)[1]','datetimeoffset') AS timestamp,
EventInfo.value('(event/@name)[1]','sysname') AS event_name,
EventInfo.value('(event/data/value)[1]','nvarchar(max)') AS sql_batch_text
FROM EventNode
ORDER BY timestamp DESC;