SQL Server предоставляет два мощных инструмента для захвата и анализа событий: Extended Events (XE) и Trace Events. В то время как Extended Events является более новым и эффективным вариантом, многие профессионалы SQL Server все еще знакомы с Trace Events и могут потребоваться преобразовать свои существующие трассировки в Extended Events. В этой статье мы исследуем взаимосвязь между этими двумя инструментами и способы их эффективного использования.
Понимание карт
При работе с Extended Events Microsoft предоставляет нам полезный объект под названием sys.dm_xe_map_values. Этот объект помогает нам переводить значения данных внутри XEvents и исследовать внутренности SQL Server. Однако, в случае трассировки событий, у нас есть другой тип карты под названием sys.trace_xe_event_map. В отличие от sys.dm_xe_map_values, эта карта реализована в виде таблицы.
Таблица sys.trace_xe_event_map содержит соответствие между событиями Extended Event и событиями SQL Trace. Путем выполнения запроса к этой таблице мы можем увидеть связь между trace_event_id и именем XE события, а также пакетом XE, связанным с каждым событием.
Исследование соответствия
Давайте углубимся в исследование соответствия между событиями трассировки и событиями XEvents. Путем объединения таблицы sys.trace_xe_event_map с другими системными таблицами мы можем получить более подробную информацию о каждом событии.
Например, мы можем выполнить следующий запрос:
SELECT xm.xe_event_name,
te.name AS trace_event_name,
tc.name AS TraceCategory,
sub.PackageName,
sub.DLLName,
sub.file_version,
sub.product_version
FROM sys.trace_xe_event_map xm
RIGHT OUTER JOIN sys.trace_events te
ON xm.trace_event_id = te.trace_event_id
RIGHT OUTER JOIN sys.trace_categories tc
ON te.category_id = tc.category_id
LEFT OUTER JOIN (
SELECT xo.name AS EventName,
xo.description AS EventDescription,
xp.name AS PackageName,
REVERSE(LEFT(REVERSE(olm.name), CHARINDEX('', REVERSE(olm.name))-1)) AS DLLName,
olm.file_version,
olm.product_version
FROM sys.dm_xe_objects xo
INNER JOIN sys.dm_xe_packages xp
ON xo.package_guid = xp.guid
INNER JOIN sys.dm_os_loaded_modules olm
ON xp.module_address = olm.base_address
WHERE xo.object_type = 'event'
) sub
ON xm.xe_event_name = sub.EventName
AND xm.package_name = sub.PackageName
ORDER BY xm.xe_event_name, tc.name;
Этот запрос предоставит нам всесторонний обзор соответствия между событиями трассировки и событиями XEvents. Мы можем увидеть имя XE события, имя события трассировки, категорию трассировки, имя пакета XE, имя DLL, версию файла и версию продукта.
Понимание многократного соответствия
Один интересный аспект соответствия – это многократное соответствие между событиями трассировки и событиями XEvents. Выполнив следующий запрос, мы можем определить trace_event_id, у которого есть несколько соответствий:
SELECT trace_event_id FROM sys.trace_xe_event_map GROUP BY trace_event_id HAVING COUNT(trace_event_id) > 1;
Например, предположим, что мы обнаружили, что у trace_event_id 165 есть несколько соответствий. Затем мы можем получить соответствующее имя XE события и имя события трассировки с помощью следующего запроса:
SELECT em.package_name, em.xe_event_name, te.name AS trace_event_name
FROM sys.trace_xe_event_map em
INNER JOIN sys.trace_events te
ON em.trace_event_id = te.trace_event_id
WHERE em.trace_event_id = 165;
Это даст нам ясное представление о событиях, у которых есть несколько соответствий, и их соответствующих именах XE событий и именах событий трассировки.
Преобразование трассировок в Extended Events
С помощью информации, предоставленной соответствием, мы теперь можем преобразовать наши существующие SQL трассировки в Extended Events. Используя возможности XE, мы можем создавать высокопроизводительные и эффективные трассировки, которые более мощны, чем их аналоги на основе профайлера.
Если вас интересует более подробное изучение Extended Events, я рекомендую прочитать мою серию статей “60 дней” о Extended Events. Эта серия охватывает широкий спектр тем и предоставляет глубокие знания по данной теме.
В заключение, понимание соответствия между Extended Events и Trace Events является важным для профессионалов SQL Server. Исследуя соответствие и используя возможности Extended Events, мы можем оптимизировать процессы захвата и анализа событий.