Поделиться через


Целевые объекты для расширенных событий

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

В этой статье объясняется, когда и как использовать целевые объекты расширенных событий. Для каждого целевого объекта в этой статье описываются следующие аспекты:

  • Его способности собирать и сообщать данные, отправленные событиями
  • Его параметры, за исключением того, где параметр является самообязательным

В следующей таблице описывается доступность каждого целевого типа в разных ядрах СУБД.

Целевой тип SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
etw_classic_sync_target Да No No
event_counter Да Да Да
event_file Да Да Да
event_stream Да Да Да
гистограмма Да Да Да
pair_matching Да No No
ring_buffer Да Да Да

Необходимые компоненты

Чтобы использовать эту статью, выполните следующие действия.

Параметры, действия и поля

Оператор CREATE EVENT SESSION является центральным для расширенных событий. Чтобы написать инструкцию, вам потребуется следующее:

  • События, которые нужно добавить в сеанс
  • Поля, связанные с каждым выбранным событием
  • Параметры, связанные с каждым целевым объектом, который требуется добавить в сеансы

Инструкции SELECT, возвращающие такие списки из системных представлений, доступны для копирования из следующей статьи в своем разделе C:

Параметры, поля и действия, используемые в контексте фактической CREATE EVENT SESSION инструкции, можно увидеть в разделе B2 (T-SQL).

Целевой объект etw_classic_sync_target

В SQL Server расширенные события могут взаимодействовать с трассировкой событий для Windows (ETW) для мониторинга системных действий. Дополнительные сведения см. в разделе:

Этот целевой объект ETW обрабатывает данные, которые он получает синхронно, в то время как большинство целевых объектов асинхронно обрабатываются.

Примечание.

Управляемый экземпляр SQL Azure и База данных SQL Azure не поддерживают целевой etw_classic_sync_target объект. В качестве альтернативы используйте целевой объект с большими двоичными объектамиevent_file, хранящимися в служба хранилища Azure.

Целевой объект event_counter

Целевой event_counter объект рассчитывает, сколько раз происходит каждое указанное событие.

В отличие от большинства других целевых объектов:

  • Целевой event_counter объект не имеет параметров.
  • Целевой event_counter объект обрабатывает данные, которые он получает синхронно.

Пример выходных данных, захваченных целевым объектом event_counter

package_name   event_name         count
------------   ----------         -----
sqlserver      checkpoint_begin   4

Далее приведен CREATE EVENT SESSION оператор, возвращающий предыдущие результаты. В этом примере package0.counter поле использовалось в WHERE предикате предложения для остановки подсчета после достижения счетчика 4.

CREATE EVENT SESSION [event_counter_1]
    ON SERVER
    ADD EVENT sqlserver.checkpoint_begin   -- Test by issuing CHECKPOINT; statements.
    (
        WHERE [package0].[counter] <= 4   -- A predicate filter.
    )
    ADD TARGET package0.event_counter
    WITH
    (
        MAX_MEMORY = 4096 KB,
        MAX_DISPATCH_LATENCY = 3 SECONDS
    );

Целевой объект event_file

Целевой event_file объект записывает выходные данные сеанса событий из буфера в файл диска или в большой двоичный объект в служба хранилища Azure:

  • Параметр в предложении ADD TARGET указываетсяfilename. Расширение файла должно быть xel.
  • Выбранное имя файла используется системой в качестве префикса, к которому добавляется длинное целое число на основе даты и времени, а затем xel расширение.

Примечание.

Управляемый экземпляр SQL Azure и База данных SQL Azure только большие двоичные объекты в служба хранилища Azure в качестве значения filename параметра.

Пример кода для База данных SQL или Управляемый экземпляр SQL см. в целевом коде event_file файла событий для расширенных событий в База данных SQL.

CREATE EVENT SESSION с целевым объектом event_file

Ниже приведен пример CREATE EVENT SESSION предложения, ADD TARGET добавляющего целевой event_file объект.

CREATE EVENT SESSION [locks_acq_rel_eventfile_22]
    ON SERVER
    ADD EVENT sqlserver.lock_acquired
    (
        SET
            collect_database_name=(1),
            collect_resource_description=(1)
        ACTION (sqlserver.sql_text,sqlserver.transaction_id)
        WHERE
        (
            [database_name]=N'InMemTest2'
            AND
            [object_id]=370100359
        )
    ),
    ADD EVENT sqlserver.lock_released
    (
        SET
            collect_database_name=1,
            collect_resource_description=1
        ACTION(sqlserver.sql_text,sqlserver.transaction_id)
        WHERE
        (
            [database_name]=N'InMemTest2'
            AND
            [object_id]=370100359
        )
    )
    ADD TARGET package0.event_counter,
    ADD TARGET package0.event_file
    (
        SET filename=N'C:\temp\locks_acq_rel_eventfile_22-.xel'
    )
    WITH
    (
        MAX_MEMORY=4096 KB,
        MAX_DISPATCH_LATENCY=10 SECONDS
    );

функция sys.fn_xe_file_target_read_file()

Целевой event_file объект сохраняет данные, которые он получает в двоичном формате, который не является удобочитаемым. Функция sys.fn_xe_file_target_read_file позволяет представить содержимое файла в виде реляционного xel набора строк.

Для SQL Server 2016 и более поздних версий используйте инструкцию SELECT , аналогичную следующему примеру.

SELECT f.*
--,CAST(f.event_data AS XML)  AS [Event-Data-Cast-To-XML]  -- Optional
FROM sys.fn_xe_file_target_read_file(
    'C:\temp\locks_acq_rel_eventfile_22-*.xel', NULL, NULL, NULL)  AS f;

Для SQL Server 2014 используйте инструкцию SELECT , аналогичную следующему примеру. После SQL Server 2014 xem файлы больше не используются.

SELECT f.*
--,CAST(f.event_data AS XML)  AS [Event-Data-Cast-To-XML]  -- Optional
FROM sys.fn_xe_file_target_read_file(
    'C:\temp\locks_acq_rel_eventfile_22-*.xel', 'C:\temp\metafile.xem', NULL, NULL) AS f;

В обоих из этих примеров подстановочный * знак используется для чтения всех xel файлов, начинающихся с указанного префикса.

В База данных SQL Azure можно вызвать sys.fn_xe_file_target_read_file() функцию после создания учетных данных с областью базы данных, содержащей маркер SAS с Read List разрешениями для контейнера с xel большими двоичными объектами:

/*
Create a master key to protect the secret of the credential
*/
IF NOT EXISTS (
    SELECT 1
    FROM sys.symmetric_keys
    WHERE name = '##MS_DatabaseMasterKey##'
)
CREATE MASTER KEY;

/*
(Re-)create a database scoped credential.
The name of the credential must match the URI of the blob container.
*/
IF EXISTS (
    SELECT *
    FROM sys.database_credentials
    WHERE name = 'https://exampleaccount4xe.blob.core.windows.net/extended-events-container'
)
DROP DATABASE SCOPED CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container];

/*
The secret is the SAS token for the container. The Read and List permissions are set.
*/
CREATE DATABASE SCOPED CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container]
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
        SECRET = 'sp=rl&st=2023-10-09T22:12:54Z&se=2023-10-10T06:12:54Z&spr=https&sv=2022-11-02&sr=c&sig=REDACTED';

/*
Return event session data
*/
SELECT f.*
--,CAST(f.event_data AS XML)  AS [Event-Data-Cast-To-XML]  -- Optional
FROM sys.fn_xe_file_target_read_file('https://exampleaccount4xe.blob.core.windows.net/extended-events-container/event-session-1', DEFAULT, DEFAULT, DEFAULT) AS f;

В Управляемый экземпляр SQL Azure можно вызвать sys.fn_xe_file_target_read_file() функцию после создания учетных данных сервера, содержащего маркер SAS с Read List разрешениями для контейнера с xel большими двоичными объектами:

IF NOT EXISTS (
    SELECT 1
    FROM sys.symmetric_keys
    WHERE name = '##MS_DatabaseMasterKey##'
)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'REDACTED';

/*
(Re-)create a database scoped credential.
The name of the credential must match the URI of the blob container.
*/
IF EXISTS (
    SELECT *
    FROM sys.credentials
    WHERE name = 'https://exampleaccount4xe.blob.core.windows.net/extended-events-container'
)
DROP CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container];

/*
The secret is the SAS token for the container. The Read and List permissions are set.
*/
CREATE CREDENTIAL [https://exampleaccount4xe.blob.core.windows.net/extended-events-container]
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
        SECRET = 'sp=rl&st=2023-10-09T22:12:54Z&se=2023-10-10T06:12:54Z&spr=https&sv=2022-11-02&sr=c&sig=REDACTED';

/*
Return event session data
*/
SELECT f.*
--,CAST(f.event_data AS XML)  AS [Event-Data-Cast-To-XML]  -- Optional
FROM sys.fn_xe_file_target_read_file('https://exampleaccount4xe.blob.core.windows.net/extended-events-container/event-session-1', DEFAULT, DEFAULT, DEFAULT) AS f;

Совет

Если указать префикс имени большого двоичного объекта вместо полного имени большого двоичного объекта в первом аргументе sys.fn_xe_file_target_read_file(), функция вернет данные из всех больших двоичных объектов в контейнере, который соответствует префиксу. Это позволяет извлекать данные из всех файлов свертывания заданного сеанса событий без использования * подстановочного знака, который не поддерживается служба хранилища Azure.

Предыдущие примеры SQL Azure опустит xel расширение для чтения всех файлов отката для сеанса с именем event-session-1.

Данные, хранящиеся в целевом объекте event_file

Это пример данных, возвращаемых в sys.fn_xe_file_target_read_file SQL Server 2016 (13.x) и более поздних версиях.

module_guid                            package_guid                           object_name     event_data                                                                                                                                                                                                                                                                                          file_name                                                      file_offset
-----------                            ------------                           -----------     ----------                                                                                                                                                                                                                                                                                          ---------                                                      -----------
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   lock_acquired   <event name="lock_acquired" package="sqlserver" timestamp="2016-08-07T20:13:35.827Z"><action name="transaction_id" package="sqlserver"><value>39194</value></action><action name="sql_text" package="sqlserver"><value><![CDATA[  select top 1 * from dbo.T_Target;  ]]></value></action></event>   C:\temp\locks_acq_rel_eventfile_22-_0_131150744126230000.xel   11776
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   lock_released   <event name="lock_released" package="sqlserver" timestamp="2016-08-07T20:13:35.832Z"><action name="transaction_id" package="sqlserver"><value>39194</value></action><action name="sql_text" package="sqlserver"><value><![CDATA[  select top 1 * from dbo.T_Target;  ]]></value></action></event>   C:\temp\locks_acq_rel_eventfile_22-_0_131150744126230000.xel   11776

целевой объект histogram

Целевой histogram объект может:

  • Подсчет вхождения для нескольких элементов отдельно
  • Подсчет вхождения различных типов элементов:
    • Поля событий
    • Действия

Целевой histogram объект обрабатывает данные, которые он получает синхронно.

Параметр source_type является ключом для управления целевым объектом гистограммы:

  • source_type=0: сбор данных для поля события.
  • source_type=1: сбор данных для действия. Это значение по умолчанию.

Значение slots по умолчанию — 256. Если назначить другое значение, оно округляется вверх до следующей степени 2. Например, слоты=59 округлялись до 64. Максимальное количество слотов гистограммы для целевого histogram объекта — 16384.

При использовании histogram в качестве целевого объекта иногда могут отображаться непредвиденные результаты. Некоторые события могут не отображаться в ожидаемых слотах, а другие слоты могут отображаться выше ожидаемого количества событий.

Это может произойти, если при назначении событий слота возникает хэш-столкновение. Хотя это редко, если возникает хэш-столкновение, событие, которое должно быть подсчитано в одном слоте, учитывается в другом. По этой причине следует учитывать, что событие не произошло только потому, что количество в определенном слоте отображается как ноль.

Давайте рассмотрим следующий пример:

  • Вы настраиваете сеанс расширенных событий, используя histogram его в качестве целевого объекта и группирования object_id, чтобы собрать хранимую процедуру выполнения.
  • Выполняется хранимая процедура A. Затем выполните хранимую процедуру B.

Если хэш-функция возвращает одно и то же значение для object_id обеих хранимых процедур, гистограмма показывает, что хранимая процедура A выполняется дважды, а хранимая процедура B не отображается.

Чтобы устранить эту проблему, если количество уникальных значений относительно небольшое, задайте количество слотов гистограммы выше квадрата ожидаемых уникальных значений. Например, если целевой histogram объект имеет свой source набор table_name в поле события, а в базе данных есть 20 таблиц, то 20*20 = 400. Следующая мощность 2 больше 400 — 512, что является рекомендуемыми числами слотов в этом примере.

Цель гистограммы с действием

В предложении ADD TARGET ... (SET ...) следующей CREATE EVENT SESSION инструкции указывается назначение source_type=1целевого параметра. Это означает, что цель гистограммы отслеживает действие.

В данном примере ADD EVENT ... (ACTION ...) предложение может предложить только одно действие для выбора, а именно sqlos.system_thread_id. В предложении ADD TARGET ... (SET ...) мы видим назначение source=N'sqlos.system_thread_id'.

Примечание.

Невозможно добавить несколько целевых объектов одного типа на сеанс событий. Это включает целевой histogram объект. Кроме того, для каждого histogram целевого объекта невозможно иметь несколько источников (действие или поле события). Поэтому для отслеживания дополнительных действий или полей событий в отдельном histogram целевом объекте требуется новый сеанс событий.

CREATE EVENT SESSION [histogram_lockacquired]
    ON SERVER
    ADD EVENT sqlserver.lock_acquired
        (
        ACTION
            (
            sqlos.system_thread_id
            )
        )
    ADD TARGET package0.histogram
        (
        SET
            filtering_event_name=N'sqlserver.lock_acquired',
            slots=16,
            source=N'sqlos.system_thread_id',
            source_type=1
        );

Были собраны указанные ниже данные. Значения в столбце value — это system_thread_id значения. Например, в потоке 6540 общее число блокировок составило 236.

value   count
-----   -----
 6540     236
 9308      91
 9668      74
10144      49
 5244      44
 2396      28

Использование инструкции SELECT для обнаружения доступных действий

Оператор C.3 SELECT может найти действия, доступные системе для указания в инструкции CREATE EVENT SESSION . WHERE В предложении сначала измените o.name LIKE фильтр, чтобы он соответствовал действиям, интересующим вас.

Далее приведен пример набора строк, возвращаемого C.3 SELECT. Действие system_thread_id видно во второй строке.

Package-Name   Action-Name                 Action-Description
------------   -----------                 ------------------
package0       collect_current_thread_id   Collect the current Windows thread ID
sqlos          system_thread_id            Collect current system thread ID
sqlserver      create_dump_all_threads     Create mini dump including all threads
sqlserver      create_dump_single_thread   Create mini dump for the current thread

Цель гистограммы с полем событий

В следующем примере задается значение source_type=0. Значением, назначенным source , является поле события.

CREATE EVENT SESSION [histogram_checkpoint_dbid]
    ON SERVER
    ADD EVENT  sqlserver.checkpoint_begin
    ADD TARGET package0.histogram
    (
    SET
        filtering_event_name = N'sqlserver.checkpoint_begin',
        source               = N'database_id',
        source_type          = 0
    );

Следующие данные были захвачены целевым histogram объектом. Данные показывают, что база данных с идентификатором 5 испытала 7 checkpoint_begin событий.

value   count
-----   -----
5       7
7       4
6       3

Использование инструкции SELECT для обнаружения доступных полей для выбранного события

В инструкции C.4 SELECT показаны поля событий, которые можно выбрать. Сначала отредактируйте фильтр, o.name LIKE чтобы он был выбранным именем события.

Следующий набор строк был возвращен C.4 SELECT. Набор строк показывает, что database_id это единственное поле в checkpoint_begin событии, которое может предоставлять значения для целевого histogram объекта.

Package-Name   Event-Name         Field-Name   Field-Description
------------   ----------         ----------   -----------------
sqlserver      checkpoint_begin   database_id  NULL
sqlserver      checkpoint_end     database_id  NULL

Целевой объект pair_matching

Целевой pair_matching объект позволяет обнаруживать события запуска, которые происходят без соответствующего конечного события. Например, это может быть проблема, когда lock_acquired событие возникает, но соответствующее lock_released событие не следует своевременно.

Система не соответствует автоматическим событиям начала и окончания. Вместо этого вы объясняете соответствие системе в инструкции CREATE EVENT SESSION . При сопоставлении события начала и окончания пара удаляется, чтобы сосредоточиться на несовпаденных событиях начала.

Поиск подходящих полей для пары событий "Начало" и "Конец"

Используя C.4 SELECT, мы видим в следующем наборе строк около 16 полей для lock_acquired события. Приведенный здесь набор строк был вручную разделен, чтобы показать, каким полям соответствует наш пример. Для некоторых полей, таких как durationпопытка сопоставления является бессмысленной.

Package-Name   Event-Name   Field-Name               Field-Description
------------   ----------   ----------               -----------------
sqlserver   lock_acquired   database_name            NULL
sqlserver   lock_acquired   mode                     NULL
sqlserver   lock_acquired   resource_0               The ID of the locked object, when lock_resource_type is OBJECT.
sqlserver   lock_acquired   resource_1               NULL
sqlserver   lock_acquired   resource_2               The ID of the lock partition, when lock_resource_type is OBJECT, and resource_1 is 0.
sqlserver   lock_acquired   transaction_id           NULL

sqlserver   lock_acquired   associated_object_id     The ID of the object that requested the lock that was acquired.
sqlserver   lock_acquired   database_id              NULL
sqlserver   lock_acquired   duration                 The time (in microseconds) between when the lock was requested and when it was canceled.
sqlserver   lock_acquired   lockspace_nest_id        NULL
sqlserver   lock_acquired   lockspace_sub_id         NULL
sqlserver   lock_acquired   lockspace_workspace_id   NULL
sqlserver   lock_acquired   object_id                The ID of the locked object, when lock_resource_type is OBJECT. For other lock resource types it will be 0
sqlserver   lock_acquired   owner_type               NULL
sqlserver   lock_acquired   resource_description     The description of the lock resource. The description depends on the type of lock. This is the same value as the resource_description column in the sys.dm_tran_locks view.
sqlserver   lock_acquired   resource_type            NULL

Пример целевого объекта pair_matching

CREATE EVENT SESSION Следующая инструкция указывает два события и два целевых объекта. Целевой pair_matching объект задает два набора полей для сопоставления событий с парами. Последовательность полей с разделителями-запятыми, назначенных begin_matching_columns и end_matching_columns должна быть одинаковой. Между полями, упомянутыми в значении с разделителями-запятыми, не допускаются вкладки или новые линии, хотя пробелы разрешены.

Чтобы сузить результаты, сначала мы выбрали его, sys.objects чтобы найти object_id таблицу тестирования. Мы добавили фильтр для этого идентификатора объекта в предложении ADD EVENT ... (WHERE ...) .

CREATE EVENT SESSION [pair_matching_lock_a_r_33]
    ON SERVER
    ADD EVENT sqlserver.lock_acquired
    (
        SET
            collect_database_name = 1,
            collect_resource_description = 1
        ACTION (sqlserver.transaction_id)
        WHERE
        (
            [database_name] = 'InMemTest2'
            AND
            [object_id] = 370100359
        )
    ),
    ADD EVENT sqlserver.lock_released
    (
        SET
            collect_database_name = 1,
            collect_resource_description = 1
        ACTION (sqlserver.transaction_id)
        WHERE
        (
            [database_name] = 'InMemTest2'
            AND
            [object_id] = 370100359
        )
    )
    ADD TARGET package0.event_counter,
    ADD TARGET package0.pair_matching
    (
        SET
            begin_event = N'sqlserver.lock_acquired',
            begin_matching_columns =
                N'resource_0, resource_1, resource_2, transaction_id, database_id',
            end_event = N'sqlserver.lock_released',
            end_matching_columns =
                N'resource_0, resource_1, resource_2, transaction_id, database_id',
            respond_to_memory_pressure = 1
    )
    WITH
    (
        MAX_MEMORY = 8192 KB,
        MAX_DISPATCH_LATENCY = 15 SECONDS
    );

Для тестирования сеанса событий мы намеренно предотвратили освобождение двух приобретенных блокировок. Для этого мы использовали следующие шаги в коде T-SQL:

  1. BEGIN TRANSACTION.
  2. UPDATE MyTable....
  3. Намеренно не выдавать COMMIT TRANSACTION, до тех пор, пока мы изучили цели.
  4. Позже после тестирования мы выпустили COMMIT TRANSACTION.

Простой event_counter целевой объект предоставил следующие выходные строки. Так как 52-50=2 выходные данные подразумевают, что при анализе выходных данных из целевого объекта сопоставления пар отображаются 2 неоплаченных lock_acquired событий.

package_name   event_name      count
------------   ----------      -----
sqlserver      lock_acquired   52
sqlserver      lock_released   50

Целевой объект предоставил следующие выходные pair_matching данные. Как показано в выходных event_counter данных, мы действительно видим две lock_acquired строки. Тот факт, что мы видим эти строки вообще означает, что эти два lock_acquired события неоплачены.

package_name   event_name      timestamp                     database_name   duration   mode   object_id   owner_type   resource_0   resource_1   resource_2   resource_description   resource_type   transaction_id
------------   ----------      ---------                     -------------   --------   ----   ---------   ----------   ----------   ----------   ----------   --------------------   -------------   --------------
sqlserver      lock_acquired   2016-08-05 12:45:47.9980000   InMemTest2      0          S      370100359   Transaction  370100359    3            0            [INDEX_OPERATION]      OBJECT          34126
sqlserver      lock_acquired   2016-08-05 12:45:47.9980000   InMemTest2      0          IX     370100359   Transaction  370100359    0            0                                   OBJECT          34126

Строки для неоплачиваемых lock_acquired событий могут включать текст T-SQL, предоставленный действием sqlserver.sql_text . При этом записывается запрос, который получил блокировки.

Целевой объект ring_buffer

Целевой ring_buffer объект удобно использовать только для быстрой и простой коллекции событий в памяти. При остановке сеанса событий хранимые выходные данные удаляются.

В этом разделе также показано, как использовать XQuery для преобразования XML-представления содержимого буфера кольца в более читаемый реляционный набор строк.

Совет

При добавлении целевого ring_buffer объекта задайте для параметра MAX_MEMORY значение 1024 КБ или меньше. Использование больших значений может ненужно увеличить потребление памяти.

По умолчанию MAX_MEMORY для целевого ring_buffer объекта не ограничено в SQL Server и ограничено 32 МБ в База данных SQL Azure и Управляемый экземпляр SQL Azure.

Данные из целевого ring_buffer объекта используются путем преобразования в XML, как показано в следующем примере. Во время этого преобразования все данные, которые не помещаются в XML-документ размером 4 МБ, опущены. Таким образом, даже если вы фиксируете больше событий в буфере кольца, используя большие MAX_MEMORY значения (или оставив этот параметр по умолчанию), вы можете не использовать все из-за ограничения в 4 МБ на размер XML-документа, учитывая затраты на разметку XML и строки Юникода.

Известно, что содержимое буфера кольца опущено во время преобразования в XML, если truncated атрибут в XML-документе имеет значение 1, например:

<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">

CREATE EVENT SESSION с целевым объектом ring_buffer

Ниже приведен пример создания сеанса событий с целевым ring_buffer объектом. В этом примере MAX_MEMORY параметр отображается дважды: один раз, чтобы задать целевую память размером 1024 КБ, а затем один раз, чтобы задать ring_buffer память буфера сеанса событий значение 2 МБ.

CREATE EVENT SESSION [ring_buffer_lock_acquired_4]
    ON SERVER
    ADD EVENT sqlserver.lock_acquired
    (
        SET collect_resource_description=(1)
        ACTION(sqlserver.database_name)
        WHERE
        (
            [object_id]=(370100359)  -- ID of MyTable
            AND
            sqlserver.database_name='InMemTest2'
        )
    )
    ADD TARGET package0.ring_buffer
    (
        SET MAX_EVENTS_LIMIT = 98,
            MAX_MEMORY = 1024
    )
    WITH
    (
        MAX_MEMORY = 2 MB,
        MAX_DISPATCH_LATENCY = 3 SECONDS
    );

Выходные данные XML, полученные для lock_acquired целевым объектом ring_buffer

При получении SELECT инструкцией содержимое кольцевого буфера отображается в виде XML-документа. Ниже показан пример. Однако для краткости все, кроме двух <event> элементов, были удалены. Кроме того, в каждом из них <event>были удалены несколько <data> элементов.

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="6" eventCount="6" droppedCount="0" memoryUsed="1032">
  <event name="lock_acquired" package="sqlserver" timestamp="2016-08-05T23:59:53.987Z">
    <data name="mode">
      <type name="lock_mode" package="sqlserver"></type>
      <value>1</value>
      <text><![CDATA[SCH_S]]></text>
    </data>
    <data name="transaction_id">
      <type name="int64" package="package0"></type>
      <value>111030</value>
    </data>
    <data name="database_id">
      <type name="uint32" package="package0"></type>
      <value>5</value>
    </data>
    <data name="resource_0">
      <type name="uint32" package="package0"></type>
      <value>370100359</value>
    </data>
    <data name="resource_1">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="resource_2">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="database_name">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[]]></value>
    </data>
    <action name="database_name" package="sqlserver">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[InMemTest2]]></value>
    </action>
  </event>
  <event name="lock_acquired" package="sqlserver" timestamp="2016-08-05T23:59:56.012Z">
    <data name="mode">
      <type name="lock_mode" package="sqlserver"></type>
      <value>1</value>
      <text><![CDATA[SCH_S]]></text>
    </data>
    <data name="transaction_id">
      <type name="int64" package="package0"></type>
      <value>111039</value>
    </data>
    <data name="database_id">
      <type name="uint32" package="package0"></type>
      <value>5</value>
    </data>
    <data name="resource_0">
      <type name="uint32" package="package0"></type>
      <value>370100359</value>
    </data>
    <data name="resource_1">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="resource_2">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="database_name">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[]]></value>
    </data>
    <action name="database_name" package="sqlserver">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[InMemTest2]]></value>
    </action>
  </event>
</RingBufferTarget>

Чтобы просмотреть предыдущий XML- код, можно выполнить следующее SELECT , пока сеанс событий активен. XML-данные извлекаются из системного представления sys.dm_xe_session_targets.

SELECT CAST(LocksAcquired.TargetXml AS XML) AS RBufXml
INTO #XmlAsTable
FROM (
    SELECT CAST(t.target_data AS XML) AS TargetXml
    FROM sys.dm_xe_session_targets AS t
    INNER JOIN sys.dm_xe_sessions AS s
        ON s.address = t.event_session_address
    WHERE t.target_name = 'ring_buffer'
        AND s.name = 'ring_buffer_lock_acquired_4'
) AS LocksAcquired;

SELECT *
FROM #XmlAsTable;

XQuery для просмотра XML-данных в виде набора строк

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

SELECT
    -- (A)
    ObjectLocks.value('(@timestamp)[1]', 'datetime') AS [OccurredDtTm],
    -- (B)
    ObjectLocks.value('(data[@name="mode"]/text)[1]', 'nvarchar(32)') AS [Mode],
    -- (C)
    ObjectLocks.value('(data[@name="transaction_id"]/value)[1]', 'bigint') AS [TxnId],
    -- (D)
    ObjectLocks.value('(action[@name="database_name" and @package="sqlserver"]/value)[1]', 'nvarchar(128)') AS [DatabaseName]
FROM #XmlAsTable
CROSS APPLY
    -- (E)
    TargetDateAsXml.nodes('/RingBufferTarget/event[@name="lock_acquired"]') AS T(ObjectLocks);

Заметки о XQuery из предыдущей инструкции SELECT

(A)

  • значение атрибута timestamp= в <event> элементе.
  • Конструкция '(...)[1]' обеспечивает только одно возвращаемое значение для каждой итерации, так как является обязательным ограничением .value() метода XQuery переменной типа данных XML и столбцов.

(B)

  • <text> внутреннее значение элемента в элементе <data> , в котором имеется атрибут name= равный mode.

(C)

  • <value> внутреннее значение элементов в элементе <data> с атрибутом name= равно transaction_id.

(Г)

  • <event> содержит <action>.
  • <action> значение атрибута name= равно database_name, а атрибут package= равен sqlserver (не package0), получает внутреннее значение <value> элемента.

(E)

  • CROSS APPLY вызывает повторение обработки для каждого отдельного <event> элемента, который имеет атрибут name , равный атрибуту lock_acquired.
  • Это относится к XML, возвращаемого предыдущим FROM предложением.

Выходные данные XQuery SELECT

Далее — набор строк, созданный предыдущим T-SQL, который включает XQuery.

OccurredDtTm              Mode    DatabaseName
------------              ----    ------------
2016-08-05 23:59:53.987   SCH_S   InMemTest2
2016-08-05 23:59:56.013   SCH_S   InMemTest2

целевой объект event_stream

Целевой event_stream объект можно использовать только в программах .NET, написанных на таких языках, как C#. C# и другие разработчики .NET могут получить доступ к потоку событий через платформа .NET Framework классы в Microsoft.SqlServer.XEvents.Linq пространстве имен. Этот целевой объект нельзя использовать в T-SQL.

Если при чтении из целевого event_stream объекта возникает ошибка 25726, The event data stream was disconnected because there were too many outstanding events. To avoid this error either remove events or actions from your session or add a more restrictive predicate filter to your session. это означает, что поток событий заполняется данными быстрее, чем клиент может использовать данные. Это приводит к отключению ядро СУБД от потока событий, чтобы избежать влияния на производительность ядро СУБД.

Пространства имен XEvent