Использование SELECT и JOIN в системных представлениях для расширенных событий в SQL Server

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

В этой статье объясняется два набора системных представлений, связанных с расширенными событиями в SQL Server и в базе данных SQL Azure. В статье рассматриваются следующие вопросы:

  • Присоединение (JOIN) различных системных представлений.
  • Выбор (SELECT) определенного рода сведений из системных представлений.
  • Представление одной и той же информации сеанса событий с точки зрения различных технологий для более глубокого понимания каждого варианта.

Большая часть примеров написана для SQL Server. Однако после внесения незначительных изменений их можно выполнить и в базе данных SQL.

О. Основные сведения

Существует два набора системных представлений для расширенных событий:

Представления каталога

  • В этих представлениях хранятся сведения об определении каждого сеанса событий, созданного с помощью CREATE EVENT SESSIONили эквивалента в пользовательском интерфейсе среды SSMS. Однако в этих представлениях нет никаких данных о том, запускались ли вообще эти сеансы.

    • Например, если в обозревателе объектов SSMS показано, что не определено ни одного сеанса событий, то при использовании инструкции SELECT в представлении sys.server_event_session_targets не будет возвращено ни одной строки.
  • Префикс имени:

    • sys.server_event_session* — это префикс имени в SQL Server.
    • sys.database_event_session* — это префикс имени в базе данных SQL.

Динамические административные представления (DMV)

  • Хранение сведений о текущей активности запущенных сеансов событий. Однако динамические административные представления содержат минимум сведений об определении сеансов.

    • Даже если в настоящее время остановлены все сеансы событий, инструкция SELECT в представлении sys.dm_xe_packages будет по-прежнему возвращать строки, так как при запуске сервера в активную память загружаются разные пакеты.
    • По этой же причине sys.dm_xe_objectssys.dm_xe_object_columns будут по-прежнему возвращать строки.
  • Префикс имени для динамических административных представлений расширенных событий:

    • sys.dm_xe_* — это префикс имени в SQL Server.
    • sys.dm_xe_database_* — это префикс имени в базе данных SQL.

Разрешения:

Для выполнения SELECT в представлениях системы необходимо следующее разрешение:

  • VIEW SERVER STATE — если на сервере Microsoft SQL Server;
  • VIEW DATABASE STATE — если в базе данных Azure SQL.

B. Представления каталога

В этом разделе сопоставляются три разных технологических подхода для одного и того же определенного сеанса событий. Сеанс был определен и отображается в обозревателе объектов среды SQL Server Management Studio (SSMS.exe), но сеанс в данный момент не запущен.

Чтобы избежать непредвиденных сбоев, рекомендуется ежемесячно устанавливать последнее обновление SSMS.

Справочная документация по представлениям каталога для расширенных событий находится в представлениях каталога расширенных событий (Transact-SQL).

 

Содержание раздела Б

 

Б.1. Обзор с использованием пользовательского интерфейса среды SSMS

В среде SSMS в обозревателе объектовоткройте диалоговое окно Новый сеанс , развернув узлы Управление>Расширенные событияи щелкнув правой кнопкой мыши Сеансы>Создать сеанс.

В большом диалоговом окне Новый сеанс в его первом разделе Общиебыл выбран параметр Запускать сеанс событий при запуске сервера.

New Session > General, Start the event session at server startup.

Далее в разделе События видно, что было выбрано событие lock_deadlock. Для этого события были выбраны три действия . Это означает, что была нажата кнопка Настроить , которая становится серой после нажатия.

New Session > Events, Global Fields (Actions)

В разделе События>Настройка видно, что полю resource_type было задано значение PAGE. Это означает, что данные события не будут отправляться от обработчика событий в целевой объект, если значение поля resource_type отлично от PAGE.

Здесь также показаны дополнительные фильтры предикатов для имени базы данных и счетчика.

New Session > Events, Filter Predicate Fields (Actions)

Затем в разделе Хранилище данных показано, что в качестве целевого объекта выбран event_file. Кроме того, здесь видно, что был выбран параметр Включить переключение файлов.

New Session > Data Storage, eventfile_enablefileroleover

И, наконец, в разделе Дополнительно показано, что значение параметра Максимальная задержка диспетчера было уменьшено до 4-х секунд.

New Session > Advanced, Maximum dispatch latency

На этом обзор определения сеанса событий с использованием пользовательского интерфейса среды SSMS завершен.

Б.2. Обзор с использованием Transact-SQL

Независимо от способа создания определения сеанса событий сеанс из пользовательского интерфейса среды SSMS можно реконструировать в точно совпадающий скрипт Transact-SQL. Можно просмотреть предыдущие снимки экрана нового сеанса и сравнить отображаемые данные с предложениями в следующем созданном скрипте T-SQL CREATE EVENT SESSION .

Чтобы реконструировать сеанс событий, в обозревателе объектов щелкните правой кнопкой мыши узел сеанса и затем выберите Создать скрипт сеанса как>Создать в>Буфер обмена.

В результате реконструирования с помощью среды был создан следующий скрипт T-SQL. Затем он был вручную доработан с использованием только пробелов.

CREATE EVENT SESSION [event_session_test3]
	ON SERVER  -- Or, if on Azure SQL Database, ON DATABASE.

	ADD EVENT sqlserver.lock_deadlock
	(
		SET
			collect_database_name = (1)
		ACTION
		(
			package0  .collect_system_time,
			package0  .event_sequence,
			sqlserver .client_hostname
		)
		WHERE
		(
			[database_name]           = N'InMemTest2'
			AND [package0].[counter] <= (16)
			AND [resource_type]       = (6)
		)
	)

	ADD TARGET package0.event_file
	(
		SET
			filename           = N'C:\Junk\event_session_test3_EF.xel',
			max_file_size      = (20),
			max_rollover_files = (2)
	)

	WITH
	(
		MAX_MEMORY            = 4096 KB,
		EVENT_RETENTION_MODE  = ALLOW_SINGLE_EVENT_LOSS,
		MAX_DISPATCH_LATENCY  = 4 SECONDS,
		MAX_EVENT_SIZE        = 0 KB,
		MEMORY_PARTITION_MODE = NONE,
		TRACK_CAUSALITY       = OFF,
		STARTUP_STATE         = ON
	);

На этом обзор с использованием T-SQL завершен.

Б.3. Обзор с использованием конструкции SELECT JOIN UNION представления каталога

Не пугайтесь! Следующая инструкция T-SQL SELECT слишком длинна только потому, что она объединяет (UNION) несколько небольших инструкций SELECT. Любая из этих небольших инструкций SELECT может выполняться самостоятельно. Небольшие инструкции SELECT демонстрируют варианты присоединения (JOIN) различных системных представлений каталогизации.

SELECT
		s.name        AS [Session-Name],
		'1_EVENT'     AS [Clause-Type],
		'Event-Name'  AS [Parameter-Name],
		e.name        AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name         AS [Session-Name],
		'2_EVENT_SET'  AS [Clause-Type],
		f.name         AS [Parameter-Name],
		f.value        AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_fields   As f

			ON  f.event_session_id = s.event_session_id
			AND f.object_id        = e.event_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name              AS [Session-Name],
		'3_EVENT_ACTION'    AS [Clause-Type],

		a.package + '.' + a.name
		                    AS [Parameter-Name],

		'(Not_Applicable)'  AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_actions  As a

			ON  a.event_session_id = s.event_session_id
			AND a.event_id         = e.event_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name                AS [Session-Name],
		'4_EVENT_PREDICATES'  AS [Clause-Type],
		e.predicate           AS [Parameter-Name],
		'(Not_Applicable)'    AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name              AS [Session-Name],
		'5_TARGET'          AS [Clause-Type],
		t.name              AS [Parameter-Name],
		'(Not_Applicable)'  AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_targets  AS t

			ON  t.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name          AS [Session-Name],
		'6_TARGET_SET'  AS [Clause-Type],
		f.name          AS [Parameter-Name],
		f.value         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_targets  AS t

			ON  t.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_fields   As f

			ON  f.event_session_id = s.event_session_id
			AND f.object_id        = t.target_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name               AS [Session-Name],
		'7_WITH_MAX_MEMORY'  AS [Clause-Type],
		'max_memory'         AS [Parameter-Name],
		s.max_memory         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions  AS s
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name                  AS [Session-Name],
		'7_WITH_STARTUP_STATE'  AS [Clause-Type],
		'startup_state'         AS [Parameter-Name],
		s.startup_state         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions  AS s
	WHERE
		s.name = 'event_session_test3'

ORDER BY
	[Session-Name],
	[Clause-Type],
	[Parameter-Name]
;

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

В следующей таблице приведены выходные данные выполнения предыдущей конструкции SELECT JOIN UNION. Имена и значения выходных параметров соответствуют результату предыдущей инструкции CREATE EVENT SESSION.

Session-Name Clause-Type Parameter-Name Parameter-Value
event_session_test3 1_EVENT Event-Name lock_deadlock
event_session_test3 2_EVENT_SET collect_database_name 1
event_session_test3 3_EVENT_ACTION sqlserver.client_hostname (Not_Applicable)
event_session_test3 3_EVENT_ACTION sqlserver.collect_system_time (Not_Applicable)
event_session_test3 3_EVENT_ACTION sqlserver.event_sequence (Not_Applicable)
event_session_test3 4_EVENT_PREDICATES ([sqlserver]. [equal_i_sql_unicode_string] ([database_name], N'InMemTest2') AND [package0]. [счетчик]<=(16)) (Not_Applicable)
event_session_test3 5_TARGET event_file (Not_Applicable)
event_session_test3 6_TARGET_SET filename C:\Junk\event_session_test3_EF.xel
event_session_test3 6_TARGET_SET max_file_size 20
event_session_test3 6_TARGET_SET max_rollover_files 2
event_session_test3 7_WITH_MAX_MEMORY max_memory 4096
event_session_test3 7_WITH_STARTUP_STATE startup_state 1

На этом раздел с представлениями каталога завершен.

C. Динамические административные представления (DMV)

Перейдем к динамическим административным представлениям. Этот раздел содержит несколько инструкций Transact-SQL SELECT, каждая из которых служит конкретной цели. Кроме того, инструкции SELECT демонстрируют, как можно применять JOIN, чтобы объединить представления DMV для использования в новых целях.

Справочная документация по DMV доступна в статье Динамические административные представления расширенных событий.

В этой статье все фактические строки выходных данных из следующих инструкций SELECT относятся к SQL Server 2016, если не указано иное.

Ниже приведен список инструкций SELECT в разделе В, посвященном представлениям DMV.

В.1. Список всех пакетов

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

SELECT  --C.1
		p.name         AS [Package],
		p.description  AS [Package-Description]
	FROM
		sys.dm_xe_packages  AS p
	ORDER BY
		p.name;

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

Ниже приведен список пакетов.

Пакет Package-Description
файловый поток Расширенные события для FILESTREAM и FileTable в SQL Server
package0 Пакет по умолчанию. Содержит все стандартные типы, карты, операторы сравнения, действия и целевые объекты
qds Расширенные события для хранилища запросов
SecAudit События аудита безопасности
sqlclr Расширенные события для SQL CLR
sqlos Расширенные события для операционной системы SQL
SQLSatellite Расширенные события для SQL Satellite
sqlserver Расширенные события для Microsoft SQL Server
sqlserver Расширенные события для Microsoft SQL Server
sqlserver Расширенные события для Microsoft SQL Server
sqlsni Расширенные события для Microsoft SQL Server
ucs Расширенные события для стека объединенных коммуникаций
XtpCompile Расширенные события для компиляции XTP
XtpEngine Расширенные события для механизма XTP
XtpRuntime Расширенные события для среды выполнения XTP

Определения приведенных выше сокращений:

  • clr — среда выполнения .NET
  • qds — хранилище данных запросов
  • sni — сетевой интерфейс сервера
  • ucs — стек единой системы связи
  • xtp — экстремальная транзакционная обработка

В.2. Количество каждого типа объекта

Здесь содержатся сведения о типах объектов, содержащихся в пакетах событий. Полный список отображается для всех типов объектов, которые находятся в sys.dm_xe_objects, а также количество для каждого типа.

SELECT  --C.2
		Count(*)  AS [Count-of-Type],
		o.object_type
	FROM
		sys.dm_xe_objects  AS o
	GROUP BY
		o.object_type
	ORDER BY
		1  DESC;

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

Ниже приведено количество объектов по типу объекта. Здесь около 1915 объектов.

Count-of-Type object_type
1303 события
351 map
84 message
77 pred_compare;
53 действие
46 pred_source;
28 тип
17 целевой объект

В.3. SELECT для всех доступных элементов, отсортированных по типу

Следующая инструкция SELECT возвращает около 1915 строк, по одной для каждого объекта.

SELECT  --C.3
		o.object_type  AS [Type-of-Item],
		p.name         AS [Package],
		o.name         AS [Item],
		o.description  AS [Item-Description]
	FROM
		     sys.dm_xe_objects  AS o
		JOIN sys.dm_xe_packages AS p  ON o.package_guid = p.guid
	WHERE
		o.object_type IN ('action' , 'target' , 'pred_source')
		AND
		(
			(o.capabilities & 1) = 0
			OR
			o.capabilities IS NULL
		)
	ORDER BY
		[Type-of-Item],
		[Package],
		[Item];

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

Чтобы удовлетворить ваш интерес, далее приводится произвольная выборка объектов, возвращенных предыдущей инструкцией SELECT.

Type-of-Item Пакет Номенклатура Item-Description
действие package0 callstack Получение текущего стека вызовов
действие package0 debug_break Прерывание процесса в отладчике по умолчанию
действие sqlos task_time Получение времени выполнения текущей задачи
действие sqlserver sql_text Получение текста SQL
события qds query_store_aprc_regression Возникает, когда хранилище запросов обнаруживает ухудшение производительности плана запроса
события SQLSatellite connection_accept Происходит при принятии нового подключения. Это событие регистрирует все попытки подключения.
события XtpCompile cgen Возникает в начале формирования кода C.
map qds aprc_state Состояние автоматического исправления снижения эффективности плана в хранилище запросов
message package0 histogram_event_required Если исходный тип равен 0, то параметру filtering_event_name необходимо задать значение.
pred_compare; package0 equal_ansi_string Оператор проверки на равенство для двух строковых значений ANSI
pred_compare; sqlserver equal_i_sql_ansi_string Оператор равенства для двух строковых значений в формате SQL ANSI
pred_source; sqlos task_execution_time Получение времени выполнения текущей задачи
pred_source; sqlserver client_app_name Получение имени текущего клиентского приложения
целевой объект package0 etw_classic_sync_target Синхронная цель средства трассировки событий для Windows (ETW)
целевой объект package0 event_counter Использование целевого параметра event_counter для подсчета экземпляров каждого события в сеансе событий.
целевой объект package0 event_file Используйте целевой объект event_file, чтобы сохранить данные события в XEL-файл, который можно заархивировать и использовать для последующего анализа и проверки. Можно выполнить слияние нескольких XEL-файлов для просмотра объединенных данных из отдельных сеансов событий.
целевой объект package0 histogram Используйте целевой объект гистограммы для объединения данных событий на основе определенного поля данных события или действия, связанного с событием. Гистограмма позволяет анализировать распределение данных событий за период сеанса событий.
целевой объект package0 pair_matching Целевой объект связывания
целевой объект package0 ring_buffer Целевой объект асинхронного кольцевого буфера
тип package0 xml XML-фрагмент правильного формата

В.4. Поля данных, доступные для события

Следующая инструкция SELECT возвращает все поля данных, относящиеся к вашему событию.

  • Обратите внимание на элемент предложения WHERE: column_type = 'data'.
  • Кроме того, потребуется изменить значение предложения WHERE для o.name =.
SELECT  -- C.4
		p.name         AS [Package],
		c.object_name  AS [Event],
		c.name         AS [Column-for-Predicate-Data],
		c.description  AS [Column-Description]
	FROM
		      sys.dm_xe_object_columns  AS c
		JOIN  sys.dm_xe_objects         AS o

			ON  o.name = c.object_name

		JOIN  sys.dm_xe_packages        AS p

			ON  p.guid = o.package_guid
	WHERE
		c.column_type = 'data'
		AND
		o.object_type = 'event'
		AND
		o.name        = '\<EVENT-NAME-HERE!>'  --'lock_deadlock'
	ORDER BY
		[Package],
		[Event],
		[Column-for-Predicate-Data];

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

Предыдущая инструкция SELECT, WHERE o.name = 'lock_deadlock'возвратила следующие строки параметров:

  • Каждая строка представляет дополнительный фильтр для события sqlserver.lock_deadlock .
  • Столбец [Column-Description] опущен из следующего отображения. Он часто имеет значение NULL.
  • Это фактические выходные данные, за исключением опущенного столбца с описанием, который часто имеет значение NULL.
  • В этих строках object_type = 'lock_deadlock'.
Пакет Event Column-for-Predicate-Data
sqlserver lock_deadlock associated_object_id
sqlserver lock_deadlock database_id
sqlserver lock_deadlock database_name
sqlserver lock_deadlock deadlock_id
sqlserver lock_deadlock duration
sqlserver lock_deadlock lockspace_nest_id
sqlserver lock_deadlock lockspace_sub_id
sqlserver lock_deadlock lockspace_workspace_id
sqlserver lock_deadlock mode
sqlserver lock_deadlock object_id
sqlserver lock_deadlock owner_type
sqlserver lock_deadlock resource_0
sqlserver lock_deadlock resource_1
sqlserver lock_deadlock resource_2
sqlserver lock_deadlock resource_description
sqlserver lock_deadlock resource_type
sqlserver lock_deadlock transaction_id

В.5. sys.dm_xe_map_values и поля событий

Следующая инструкция SELECT содержит оператор JOIN для сложного представления с именем sys.dm_xe_map_values.

Назначение SELECT заключается в отображении множества полей, из которых можно выбрать необходимые для сеанса событий. Поля событий можно использовать двумя способами:

  • для выбора значений полей, которые будут записываться в целевой объект для каждого вхождения события;
  • для фильтрации вхождений событий, которые будут отправляться из целевого объекта или оставаться в нем.
SELECT  --C.5
		dp.name         AS [Package],
		do.name         AS [Object],
		do.object_type  AS [Object-Type],
		'o--c'     AS [O--C],
		dc.name         AS [Column],
		dc.type_name    AS [Column-Type-Name],
		dc.column_type  AS [Column-Type],
		dc.column_value AS [Column-Value],
		'c--m'     AS [C--M],
		dm.map_value    AS [Map-Value],
		dm.map_key      AS [Map-Key]
	FROM
		      sys.dm_xe_objects         AS do
		JOIN  sys.dm_xe_object_columns  AS dc

			ON  dc.object_name = do.name

		JOIN  sys.dm_xe_map_values      AS dm

			ON  dm.name = dc.type_name

		JOIN  sys.dm_xe_packages        AS dp

			ON  dp.guid = do.package_guid
	WHERE
		do.object_type = 'event'
		AND
		do.name        = '\<YOUR-EVENT-NAME-HERE!>'  --'lock_deadlock'
	ORDER BY
		[Package],
		[Object],
		[Column],
		[Map-Value];

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

Далее приведена выборка фактических 153 строк выходных данных из предыдущего результата выполнения T-SQL SELECT. Строка для resource_typeсоответствующая предикату фильтрации, используемый в event_session_test3 пример в другом месте в этой статье.

/***  5 sampled rows from the actual 153 rows returned.
	NOTE:  'resource_type' under 'Column'.

Package     Object          Object-Type   O--C   Column          Column-Type-Name     Column-Type   Column-Value   C--M   Map-Value        Map-Key
-------     ------          -----------   ----   ------          ----------------     -----------   ------------   ----   ---------        -------
sqlserver   lock_deadlock   event         o--c   CHANNEL         etw_channel          readonly      2              c--m   Operational      4
sqlserver   lock_deadlock   event         o--c   KEYWORD         keyword_map          readonly      16             c--m   access_methods   1024
sqlserver   lock_deadlock   event         o--c   mode            lock_mode            data          NULL           c--m   IX               8
sqlserver   lock_deadlock   event         o--c   owner_type      lock_owner_type      data          NULL           c--m   Cursor           2
sqlserver   lock_deadlock   event         o--c   resource_type   lock_resource_type   data          NULL           c--m   PAGE             6

Therefore, on your CREATE EVENT SESSION statement, in its ADD EVENT WHERE clause,
you could put:
	WHERE( ... resource_type = 6 ...)  -- Meaning:  6 = PAGE.
***/

В.6. Параметры для целевых объектов

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

  • Обратите внимание на элемент предложения WHERE: object_type = 'customizable'.
  • Кроме того, потребуется изменить значение предложения WHERE для o.name =.
SELECT  --C.6
		p.name        AS [Package],
		o.name        AS [Target],
		c.name        AS [Parameter],
		c.type_name   AS [Parameter-Type],

		CASE c.capabilities_desc
			WHEN 'mandatory' THEN 'YES_Mandatory'
			ELSE 'Not_mandatory'
		END  AS [IsMandatoryYN],

		c.description AS [Parameter-Description]
	FROM
		      sys.dm_xe_objects   AS o
		JOIN  sys.dm_xe_packages  AS p

			ON  o.package_guid = p.guid

		LEFT OUTER JOIN  sys.dm_xe_object_columns  AS c

			ON  o.name        = c.object_name
			AND c.column_type = 'customizable'  -- !
	WHERE
		o.object_type = 'target'
		AND
		o.name     LIKE '%'    -- Or '\<YOUR-TARGET-NAME-HERE!>'.
	ORDER BY
		[Package],
		[Target],
		[IsMandatoryYN]  DESC,
		[Parameter];

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

Приведенные ниже строки параметров являются подмножеством данных, возвращенных предыдущей инструкцией SELECT в SQL Server 2016.

/***  Actual output, all rows, where target name = 'event_file'.
Package    Target       Parameter            Parameter-Type       IsMandatoryYN   Parameter-Description
-------    ------       ---------            --------------       -------------   ---------------------
package0   event_file   filename             unicode_string_ptr   YES_Mandatory   Specifies the location and file name of the log
package0   event_file   increment            uint64               Not_mandatory   Size in MB to grow the file
package0   event_file   lazy_create_blob     boolean              Not_mandatory   Create blob upon publishing of first event buffer, not before.
package0   event_file   max_file_size        uint64               Not_mandatory   Maximum file size in MB
package0   event_file   max_rollover_files   uint32               Not_mandatory   Maximum number of files to retain
package0   event_file   metadatafile         unicode_string_ptr   Not_mandatory   Not used
***/

В.7. Инструкция SELECT DMV, приводящая столбец target_data к формату XML

Эта инструкция DMV SELECT возвращает строки данных из целевого объекта открытого сеанса событий. Данные приведены к формату XML, поэтому возвращенную ячейку можно активировать щелчком мыши для простоты отображения в среде.

  • Если сеанс событий остановлен, SELECT не возвратит ни одной строки.
  • Потребуется изменить значение предложения WHERE для s.name =.
SELECT  --C.7
		s.name,
		t.target_name,
		CAST(t.target_data AS XML)  AS [XML-Cast]
	FROM
		      sys.dm_xe_session_targets  AS t
		JOIN  sys.dm_xe_sessions         AS s

			ON s.address = t.event_session_address
	WHERE
		s.name = '\<Your-Session-Name-Here!>';

Выходные данные в виде единственной строки, включая ячейку XML

Здесь приведена единственная строка, являющаяся выходными данными выполнения предыдущей инструкции SELECT. Столбец XML-Cast содержит строку XML-данных, которую среда SSMS считает XML. Поэтому SSMS понимает, что ячейку XML-Cast необходимо сделать активной по щелчку.

Для данного запуска:

  • S.name = значение, заданное для сеанса событий для события checkpoint_begin .
  • Целевой объект — ring_buffer.
name                              target_name   XML-Cast
----                              -----------   --------
checkpoint_session_ring_buffer2   ring_buffer   <RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="2" eventCount="2" droppedCount="0" memoryUsed="104"><event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:23.508Z"><data name="database_id"><type name="uint32" package="package0" /><value>5</value></data></event><event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:26.975Z"><data name="database_id"><type name="uint32" package="package0" /><value>5</value></data></event></RingBufferTarget>

Выходные данные, XML-данные, отображаемые после щелчка ячейки

После щелчка ячейки XML-Cast отображаются следующие данные.

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="2" eventCount="2" droppedCount="0" memoryUsed="104">
  <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:23.508Z">
    <data name="database_id">
      <type name="uint32" package="package0" />
      <value>5</value>
    </data>
  </event>
  <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:26.975Z">
    <data name="database_id">
      <type name="uint32" package="package0" />
      <value>5</value>
    </data>
  </event>
</RingBufferTarget>

В.8. Использование SELECT в функции для получения данных event_file с диска

Предположим, что сеанс событий собрал некоторые данные и позднее был остановлен. Если сеанс был определен для использования целевого объекта event_file, вы по-прежнему можете получать данные путем вызова функции sys.fn_xe_target_read_file.

  • Перед запуском этой инструкции SELECT необходимо изменить путь и имя файла в параметре вызова функции.
    • Не обращайте внимание на дополнительные цифры, которые система SQL будет внедрять в реальные имена XEL-файлов при каждом перезапуске сеанса. Просто укажите обычное корневое имя и расширение.
SELECT  --C.8
		f.module_guid,
		f.package_guid,
		f.object_name,
		f.file_name,
		f.file_offset,
		CAST(f.event_data AS XML)  AS [Event-Data-As-XML]
	FROM
		sys.fn_xe_file_target_read_file(

			'\<YOUR-PATH-FILE-NAME-ROOT-HERE!>*.xel',
			--'C:\Junk\Checkpoint_Begins_ES*.xel',  -- Example.

			NULL, NULL, NULL
		)  AS f;

Выходные данные, строки, возвращенные SELECT FROM (выбор из функции)

Далее приведены строки, возвращенные предыдущим запросом SELECT FROM. Крайний правый столбец XML содержит данные, касающиеся вхождения события.

module_guid                            package_guid                           object_name        file_name                                                           file_offset   Event-Data-As-XML
-----------                            ------------                           -----------        ---------                                                           -----------   -----------------
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_begin   C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5120          <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:14.023Z"><data name="database_id"><value>5</value></data><action name="session_id" package="sqlserver"><value>60</value></action><action name="database_id" package="sqlserver"><value>5</value></action></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_end     C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5120          <event name="checkpoint_end" package="sqlserver" timestamp="2016-07-09T03:30:14.025Z"><data name="database_id"><value>5</value></data></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_begin   C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5632          <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:17.704Z"><data name="database_id"><value>5</value></data><action name="session_id" package="sqlserver"><value>60</value></action><action name="database_id" package="sqlserver"><value>5</value></action></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_end     C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5632          <event name="checkpoint_end" package="sqlserver" timestamp="2016-07-09T03:30:17.709Z"><data name="database_id"><value>5</value></data></event>

Выходные данные, одна ячейка XML

Далее приведено содержимое первой ячейки XML из предыдущего возвращенного набора строк.

<event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:14.023Z">
  <data name="database_id">
    <value>5</value>
  </data>
  <action name="session_id" package="sqlserver">
    <value>60</value>
  </action>
  <action name="database_id" package="sqlserver">
    <value>5</value>
  </action>
</event>