Преобразование существующего скрипта трассировки SQL в сеанс расширенных событий
При наличии существующего скрипта трассировки SQL, который требуется преобразовать для сеанса расширенных событий, можно использовать процедуры из данного раздела для создания эквивалентного сеанса расширенных событий. С помощью системных таблиц trace_xe_action_map и trace_xe_event_map можно собрать сведения, необходимые для выполнения преобразования.
Эти действия включают следующие шаги.
Создание сеанса трассировки SQL и получение идентификатора трассировки с помощью существующего скрипта.
Выполнение запроса, использующего функцию fn_trace_geteventinfo для поиска эквивалентных событий и действий расширенных событий для каждого класса событий трассировки SQL и связанных с ним столбцов.
Функция fn_trace_getfilterinfo позволяет получить список фильтров и эквивалентных действий расширенных событий для использования.
Создайте сеанс расширенных событий вручную с помощью эквивалентных событий, действий и предикатов (фильтров) расширенных событий.
Получение идентификатора трассировки
Откройте скрипт трассировки SQL в редакторе запросов и выполните его, чтобы создать сеанс трассировки. Обратите внимание, что для выполнения этой процедуры не нужно запускать сеанс трассировки.
Получите идентификатор трассировки. Для этого выполните следующий запрос:
SELECT * FROM sys.traces; GO
Примечание Идентификатор трассировки 1 обычно соответствует трассировке по умолчанию.
Определение эквивалентов расширенных событий
Чтобы определить эквивалентные события и действия расширенных событий, выполните приведенный ниже запрос, в котором параметру trace_id присвоено значение идентификатора трассировки, полученное в предыдущей процедуре.
Примечание В этом примере используется код идентификатор для трассировки по умолчанию (1).
USE MASTER; GO DECLARE @trace_id int; SET @trace_id = 1; SELECT DISTINCT el.eventid, em.package_name, em.xe_event_name AS 'event' , el.columnid, ec.xe_action_name AS 'action' FROM (sys.fn_trace_geteventinfo(@trace_id) AS el LEFT OUTER JOIN sys.trace_xe_event_map AS em ON el.eventid = em.trace_event_id) LEFT OUTER JOIN sys.trace_xe_action_map AS ec ON el.columnid = ec.trace_column_id WHERE em.xe_event_name IS NOT NULL AND ec.xe_action_name IS NOT NULL;
Возвращаются эквивалентные идентификатор события, имя пакета, имя события, идентификатор столбца и имя действия расширенных событий. Эти выходные данные будут использоваться в процедуре «Создание сеанса расширенных событий» далее в этом разделе.
В некоторых случаях отфильтрованный столбец сопоставляется с полем данных события, включенным по умолчанию в событие расширенных событий. Поэтому столбец «Extended_Events_action_name» будет иметь значение NULL. В этом случае необходимо выполнить следующие действия, чтобы определить, какое поле данных эквивалентно отфильтрованному столбцу.
Для действий, возвращающих значение NULL, определите в скрипте классы событий трассировки SQL, содержащие фильтруемый столбец.
Например, при использовании класса событий SP:StmtCompleted мог быть указан фильтр по имени столбца трассировки Duration (идентификатор класса событий трассировки SQL — 45, идентификатор столбца SQL-трассировки — 13). В этом случае имя действия будет отображаться в результатах запроса как значение NULL.
Для каждого класса событий трассировки SQL, определенных в предыдущем шаге, найдите эквивалентное имя события расширенных событий. (Если вы не уверены в правильности имени эквивалентного события, используйте запрос, приведенный в разделе Просмотр эквивалентов расширенных событий для классов событий трассировки SQL.)
Следующий запрос используется для определения правильных полей данных для событий, определенных в предыдущем шаге. Запрос отображает поля данных расширенных событий в столбце «event_field». В запросе замените <event_name> именем события, указанного на предыдущем шаге.
SELECT xp.name package_name, xe.name event_name ,xc.name event_field, xc.description FROM sys.trace_xe_event_map AS em INNER JOIN sys.dm_xe_objects AS xe ON em.xe_event_name = xe.name INNER JOIN sys.dm_xe_packages AS xp ON xe.package_guid = xp.guid AND em.package_name = xp.name INNER JOIN sys.dm_xe_object_columns AS xc ON xe.name = xc.object_name WHERE xe.object_type = 'event' AND xc.column_type <> 'readonly' AND em.xe_event_name = '<event_name>';
Например, класс событий SP:StmtCompleted сопоставляется с событием sp_statement_completed расширенных событий. Если указать в запросе в качестве имени события sp_statement_completed, то в полях, которые по умолчанию включаются в событие, появится столбец «event_field». Среди полей есть поле «duration». Чтобы создать фильтр в эквивалентном сеансе расширенных событий, необходимо добавить предикат, например «WHERE duration > 0». В качестве примера см. процедуру «Создание сеанса расширенных событий» в этом разделе.
Создание сеанса расширенных событий
Воспользуйтесь редактором запросов для создания сеанса расширенных событий и записи выходных данных в целевой файл. Следующие шаги описывают один запрос, там же объясняется, как строить запрос. Полный пример запроса см. в подразделе «Пример» этого раздела.
Добавьте инструкции создания сеанса событий, заменив session_name тем именем, которое должно использоваться для сеанса расширенных событий.
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name') DROP EVENT SESSION [Session_Name] ON SERVER; CREATE EVENT SESSION [Session_Name] ON SERVER;
Добавьте события и действия расширенных событий, возвращенные в качестве выходных данных в процедуре «Определение эквивалентов расширенных событий», и предикаты (фильтры), определенные в процедуре «Определение фильтров, использованных в скрипте».
В следующем примере используется скрипт трассировки SQL с классами событий SQL:StmtStarting и SP:StmtCompleted и фильтрами по полям session_id и duration. Образец выходных данных для запроса процедуры «Определение эквивалентов расширенных событий» представляет собой следующий результирующий набор:
Eventid package_name event columnid action 44 sqlserver sp_statement_starting 6 nt_username 44 sqlserver sp_statement_starting 9 client_pid 44 sqlserver sp_statement_starting 10 client_app_name 44 sqlserver sp_statement_starting 11 server_principal_name 44 sqlserver sp_statement_starting 12 session_id 45 sqlserver sp_statement_completed 6 nt_username 45 sqlserver sp_statement_completed 9 client_pid 45 sqlserver sp_statement_completed 10 client_app_name 45 sqlserver sp_statement_completed 11 server_principal_name 45 sqlserver sp_statement_completed 12 session_id
Для преобразования его в эквивалент расширенных событий добавляются события sqlserver.sp_statement_starting и sqlserver.sp_statement_completed со списком действий. Инструкции-предикаты включены в качестве предложений WHERE.
ADD EVENT sqlserver.sp_statement_starting (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 ), ADD EVENT sqlserver.sp_statement_completed (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE sqlserver.session_id = 59 AND duration > 0 )
Добавьте целевой асинхронный файл, заменив путь к файлу расположением, в котором требуется сохранить выходные данные. При использовании целевого файла следует включить путь к файлу журнала и метаданных.
ADD TARGET package0.asynchronous_file_target( SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
Просмотр результатов
Просмотреть выходные данные можно с помощью функции sys.fn_xe_file_target_read_file. Для этого запустите следующий запрос, заменив пути к файлам указанными путями:
SELECT *, CAST(event_data as XML) AS 'event_data_XML' FROM sys.fn_xe_file_target_read_file('c:\temp\ExtendedEventsStoredProcs*.xel', 'c:\temp\ExtendedEventsStoredProcs*.xem', NULL, NULL);
Примечание Приведение данных события к XML является необязательным.
Дополнительные сведения о функции sys.fn_xe_file_target_read_file см. в разделе sys.fn_xe_file_target_read_file (Transact-SQL).
Пример
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='session_name')
DROP EVENT SESSION [session_name] ON SERVER;
CREATE EVENT SESSION [session_name]
ON SERVER
ADD EVENT sqlserver.sp_statement_starting
(ACTION
(
sqlserver.nt_username,
sqlserver.client_pid,
sqlserver.client_app_name,
sqlserver.server_principal_name,
sqlserver.session_id
)
WHERE sqlserver.session_id = 59
),
ADD EVENT sqlserver.sp_statement_completed
(ACTION
(
sqlserver.nt_username,
sqlserver.client_pid,
sqlserver.client_app_name,
sqlserver.server_principal_name,
sqlserver.session_id
)
WHERE sqlserver.session_id = 59 AND duration > 0
)
ADD TARGET package0.asynchronous_file_target
(SET filename='c:\temp\ExtendedEventsStoredProcs.xel', metadatafile='c:\temp\ExtendedEventsStoredProcs.xem');
См. также
Основные понятия
Просмотр эквивалентов расширенных событий для классов событий трассировки SQL