Создание сеанса событий с целевым объектом ring_buffer в памяти

Применимо к:База данных SQL Azure Управляемый экземпляр SQL Azure

Ниже приведены общие действия, описанные в этом пошаговом руководстве.

  1. Создание и запуск сеанса событий с целевым ring_buffer объектом
  2. Просмотр захваченных данных событий как XML
  3. Просмотр захваченных данных событий в виде реляционного набора строк

ring_buffer С целевым объектом шаги проще, чем с event_file целевым объектом, так как не нужно хранить данные событий в служба хранилища Azure.

Создание и запуск сеанса событий с помощью целевого объекта ring_buffer

Чтобы создать новый сеанс событий в СРЕДЕ SQL Server Management Studio (SSMS), разверните узел расширенных событий . Этот узел находится в папке базы данных в База данных SQL Azure и в папке "Управление" в Управляемый экземпляр SQL Azure. Щелкните правой кнопкой мыши папку "Сеансы" и выберите "Создать сеанс...". На странице "Общие " введите имя сеанса, которое находится example-session в этом примере. На странице "События" выберите одно или несколько событий, которые нужно добавить в сеанс. В этом примере мы выбрали sql_batch_starting событие.

Screenshot of the New Session SSMS dialog showing the event selection page with the sql_batch_starting event selected.

На странице "Данные служба хранилища" выберите ring_buffer целевой тип. Чтобы сохранить память, рекомендуется сохранить количество событий небольшим числом (1000 по умолчанию), а максимальное количество буферных памяти — 1 МБ или меньше. Дополнительные сведения см. в разделе ring_buffer целевой объект.

Screenshot of the New Session SSMS dialog showing the data storage selection page with a ring_buffer target selected.

Теперь, когда сеанс настроен, можно при необходимости выбрать кнопку "Скрипт ", чтобы создать скрипт T-SQL сеанса, чтобы сохранить его позже. Ниже приведен сценарий для нашего примера сеанса:

CREATE EVENT SESSION [example-session] ON DATABASE
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.ring_buffer(SET max_memory=(1024))
GO

Нажмите кнопку "ОК ", чтобы создать сеанс.

Просмотр данных сеанса как XML

В обозреватель объектов разверните папку Session, чтобы увидеть созданный сеанс событий. По умолчанию сеанс не запускается при его создании. Чтобы запустить сеанс, щелкните правой кнопкой мыши имя сеанса и выберите "Пуск сеанса". Позже его можно остановить, нажав кнопку "Остановить сеанс", после запуска сеанса.

Так как пакеты T-SQL выполняются в этой базе данных или управляемом экземпляре, сеанс записывает события в буфер памяти. Так как размер буфера памяти является конечным, после того как все данные памяти используются устаревшими событиями карта, чтобы освободить место для новых событий.

В обозреватель объектов разверните сеанс, чтобы просмотреть целевой package0.ring_buffer объект и дважды щелкните целевой объект. Вы также можете щелкнуть правой кнопкой мыши и выбрать представление целевых данных.... Откроется сетка с показанным фрагментом XML. Выберите этот фрагмент XML, чтобы увидеть XML-документ, представляющий содержимое буфера памяти.

Первая строка XML-документа описывает сеанс и целевые метаданные:

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="17" eventCount="17" droppedCount="0" memoryUsed="32070">

В этом примере мы видим, что 17 событий были обработаны целевым ring_buffer объектом. События не были удалены, так как буферная память не была исчерпана, а максимальное количество событий, настроенных (1000) не достигнуто.

Совет

Обратите внимание на truncated атрибут. Если задано значение 1, это означает, что XML-представление буфера памяти не отображает весь содержимое буфера. Дополнительные сведения см. в разделе ring_buffer целевой объект.

Остальная часть XML-документа содержит события. Представление одного события в XML может выглядеть следующим образом:

  <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 Здесь атрибут содержит пакет T-SQL (один запрос в этом примере).

Просмотр данных сеанса в виде реляционного набора строк

Чтобы просмотреть данные событий из целевого ring_buffer объекта в реляционном наборе строк, необходимо написать запрос T-SQL, использующий выражения XQuery для преобразования XML в реляционные данные.

Ниже приведен пример созданного сеанса, в котором отображаются последние события:

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;