Udostępnij za pośrednictwem


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:

  1. Tworzenie i uruchamianie sesji zdarzeń przy użyciu ring_buffer elementu docelowego
  2. Wyświetlanie przechwyconych danych zdarzenia jako xml
  3. 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.

Zrzut ekranu przedstawiający okno dialogowe Nowy program SSMS sesji przedstawiający stronę wyboru zdarzenia z wybranym zdarzeniem sql_batch_starting.

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.

Zrzut ekranu przedstawiający okno dialogowe Nowy program SSMS sesji przedstawiający stronę wyboru magazynu danych z wybraną ring_buffer docelową.

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;