Целевые объекты для расширенных событий
Область применения: 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 | Да | Да | Да |
Необходимые компоненты
Чтобы использовать эту статью, выполните следующие действия.
Ознакомьтесь с основами расширенных событий, как описано в кратком руководстве: расширенные события.
Установили последнюю версию SQL Server Management Studio (SSMS). Дополнительные сведения см. в разделе Скачивание SQL Server Management Studio (SSMS).
В SSMS узнайте, как использовать обозреватель объектов, чтобы щелкнуть правой кнопкой мыши целевой узел в сеансе событий, чтобы легко просматривать выходные данные.
Параметры, действия и поля
Оператор CREATE EVENT SESSION является центральным для расширенных событий. Чтобы написать инструкцию, вам потребуется следующее:
- События, которые нужно добавить в сеанс
- Поля, связанные с каждым выбранным событием
- Параметры, связанные с каждым целевым объектом, который требуется добавить в сеансы
Инструкции SELECT, возвращающие такие списки из системных представлений, доступны для копирования из следующей статьи в своем разделе C:
Параметры, поля и действия, используемые в контексте фактической CREATE EVENT SESSION
инструкции, можно увидеть в разделе B2 (T-SQL).
Целевой объект etw_classic_sync_target
В SQL Server расширенные события могут взаимодействовать с трассировкой событий для Windows (ETW) для мониторинга системных действий. Дополнительные сведения см. в разделе:
- Цель "Средство трассировки событий для Windows"
- Мониторинг активности системы с помощью расширенных событий
Этот целевой объект 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:
BEGIN TRANSACTION
.UPDATE MyTable...
.- Намеренно не выдавать
COMMIT TRANSACTION
, до тех пор, пока мы изучили цели. - Позже после тестирования мы выпустили
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.
это означает, что поток событий заполняется данными быстрее, чем клиент может использовать данные. Это приводит к отключению ядро СУБД от потока событий, чтобы избежать влияния на производительность ядро СУБД.