Published on

September 22, 2015

Исследование действий SQL Server в расширенных событиях

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

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

Давайте посмотрим на пример скрипта, демонстрирующего, как развернуть действия в сеансе событий:

CREATE EVENT SESSION [demosession] ON SERVER
ADD EVENT sqlserver.auto_stats ( 
SET collect_database_name = ( 1 )
ACTION (
  package0.event_sequence
, sqlos.cpu_id
, sqlserver.database_id
, sqlserver.database_name 
)
WHERE ( [database_name] = N'AdventureWorks2014' )
)
ADD TARGET package0.event_file 
( SET filename = N'demosession'
, max_file_size = ( 50 )
, max_rollover_files = ( 6 )
),
ADD TARGET package0.ring_buffer
(SET max_events_limit=(666)
,max_memory=(65536)
,occurrence_number=(3)
)
WITH ( EVENT_RETENTION_MODE = ALLOW_MULTIPLE_EVENT_LOSS
, MAX_DISPATCH_LATENCY = 5 SECONDS
, MAX_EVENT_SIZE = 2048 KB
, MEMORY_PARTITION_MODE = PER_NODE
, TRACK_CAUSALITY = ON
, STARTUP_STATE = ON
);

В этом примере мы назначили четыре действия для события “auto_stats”. Но как мы можем получить доступ к метаданным для этих развернутых действий?

SQL Server предоставляет представление каталога под названием “sys.server_event_session_actions”, которое отображает эту метаданные. Мы можем использовать запрос, подобный следующему, чтобы получить метаданные действия для конкретного сеанса:

SELECT ses.name AS SessionName, sesa.name AS ActionName, sesa.event_id, sesa.package, sesa.module
FROM sys.server_event_session_actions sesa
INNER JOIN sys.server_event_sessions ses
ON sesa.event_session_id = ses.event_session_id
WHERE ses.name = 'demosession';

Этот запрос объединяет представление “sys.server_event_session_actions” с каталоговым представлением “sys.server_event_sessions”, чтобы отфильтровать результаты для конкретного развернутого сеанса, который мы хотим исследовать. Результаты покажут нам, какие действия были развернуты и их соответствующие идентификаторы событий.

Но есть еще больше для изучения! Мы можем дополнительно исследовать метаданные развернутых действий, используя более продвинутый запрос:

SELECT ses.name AS SessionName, sesa.name AS ActionName, sese.name AS EventName, sesa.package
, xo.type_name, xo.type_size, xo.description
, REVERSE(LEFT(REVERSE(olm.name), CHARINDEX('\', REVERSE(olm.name))-1)) AS DLLName
FROM sys.server_event_session_actions sesa
INNER JOIN sys.server_event_sessions ses
ON sesa.event_session_id = ses.event_session_id
INNER JOIN sys.server_event_session_events sese
ON sesa.event_session_id = sese.event_session_id
AND sesa.event_id = sese.event_id
INNER JOIN sys.dm_xe_objects xo
ON xo.name = sesa.name
AND xo.object_type = 'action'
INNER JOIN sys.dm_xe_packages xp
ON xp.module_guid = sesa.module
AND xp.name = sesa.package
INNER JOIN sys.dm_os_loaded_modules olm
ON xp.module_address = olm.base_address
WHERE ses.name = 'demosession';

Этот запрос предоставляет более подробную информацию о действиях, включая тип данных, описание и DLL и пакет, связанные с действием.

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

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

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.