Открыть сервис

Extended Events

Extended Events — это легковесная, высокопроизводительная система трассировки и мониторинга событий, встроенная в ядро системы управления базами данных Microsoft SQL Server, начиная с версии SQL Server 2008. Она предназначена для сбора, анализа и устранения неисправностей в работе сервера баз данных, позволяя администраторам и разработчикам получать детализированную информацию о внутренних процессах, производительности, ошибках и блокировках без значительного влияния на нагрузку системы. Extended Events пришла на смену устаревшим инструментам, таким как SQL Trace и Profiler, предлагая более гибкую, масштабируемую и менее ресурсоёмкую архитектуру.

История и развитие

До появления Extended Events основным инструментом для мониторинга SQL Server был SQL Trace (реализованный через хранимые процедуры sp_trace_create и т.д.) и его графическая оболочка — SQL Server Profiler. Однако SQL Trace имел ряд ограничений: он был привязан к определённым версиям, потреблял значительные ресурсы сервера, особенно при активном трассировании, и не позволял гибко настраивать фильтрацию и сбор данных. Кроме того, он был ориентирован на события, связанные с запросами, и не покрывал многие внутренние механизмы ядра.

В ответ на эти недостатки, в SQL Server 2008 была представлена новая система — Extended Events. Она была разработана с нуля, используя модель событийного программирования, и изначально была доступна только для опытных администраторов через T-SQL. В SQL Server 2012 Extended Events получила графический интерфейс в среде SQL Server Management Studio (SSMS), что значительно упростило её использование. В последующих версиях (2014, 2016, 2017, 2019, 2022) функциональность была расширена: добавлены новые события, действия, цели, улучшена интеграция с системой динамических представлений (DMV) и расширены возможности фильтрации.

Архитектура и компоненты

Extended Events построена на модульной архитектуре, состоящей из нескольких ключевых компонентов, которые взаимодействуют друг с другом:

Пакеты (Packages)

Пакеты — это контейнеры, содержащие объекты Extended Events. Каждый пакет представляет собой динамическую библиотеку (DLL) или модуль, загружаемый в память SQL Server. Основные пакеты:

  • sqlserver — содержит большинство событий, действий и предикатов, связанных с ядром SQL Server.
  • sqlos — содержит события, связанные с операционной системой, такие как планирование потоков и управление памятью.
  • package0 — базовый пакет, содержащий фундаментальные типы данных, такие как int64, unicode_string и timestamp.

События (Events)

События — это точки в коде SQL Server, где может быть зафиксирована определённая активность. Каждое событие имеет уникальное имя и набор полей (данных), которые оно может предоставить. Например, событие sqlserver.sql_statement_completed срабатывает при завершении выполнения T-SQL оператора и предоставляет такие поля, как duration, cpu_time, logical_reads и physical_reads. Всего в SQL Server 2022 насчитывается более 1000 различных событий.

Действия (Actions)

Действия — это дополнительные операции, которые выполняются при срабатывании события. Они позволяют добавить к событию контекстную информацию, которая не входит в стандартный набор полей события. Например, действие sqlserver.sql_text добавляет текст T-SQL запроса, а sqlserver.session_id — идентификатор сессии. Действия могут быть глобальными (применяются ко всем событиям в сессии) или локальными.

Цели (Targets)

Цели — это места, куда отправляются собранные данные. Extended Events поддерживает несколько типов целей:

  • event_file — сохраняет данные в файл на диске (формат XEL). Это наиболее распространённая цель, так как файлы можно анализировать позже.
  • ring_buffer — хранит данные в оперативной памяти в виде кольцевого буфера. Полезен для быстрого анализа текущих событий, но данные теряются при перезапуске сервера.
  • event_counter — подсчитывает количество срабатываний каждого события без сохранения деталей. Используется для оценки частоты событий.
  • pair_matching — сопоставляет пары событий (например, начало и конец операции) для вычисления длительности.
  • etw_classic_sync_target — передаёт данные в систему трассировки событий Windows (ETW) для интеграции с другими инструментами.

Предикаты (Predicates)

Предикаты — это фильтры, которые определяют, при каких условиях событие будет захвачено. Они позволяют избежать сбора ненужных данных, снижая нагрузку. Предикаты могут быть простыми (например, duration > 1000) или сложными, с использованием логических операторов (AND, OR, NOT). Фильтрация выполняется на стороне ядра до того, как событие будет отправлено в цель, что минимизирует накладные расходы.

Сессии Extended Events

Сессия — это экземпляр мониторинга, который объединяет события, действия, цели и предикаты. Сессии создаются с помощью T-SQL команд CREATE EVENT SESSION или через графический интерфейс SSMS. Сессия может быть активной (запущенной) или остановленной. Она может быть сконфигурирована для работы в реальном времени или для сбора данных в фоновом режиме.

Пример создания простой сессии, которая захватывает все SQL-запросы длительностью более 1 секунды и сохраняет их в файл:

``sql CREATE EVENT SESSION [LongRunningQueries] ON SERVER ADD EVENT sqlserver.sql_statement_completed( ACTION (sqlserver.sql_text, sqlserver.session_id) WHERE ([duration] > 1000000) -- 1 секунда = 1 000 000 микросекунд ) ADD TARGET package0.event_file(SET filename = N'C:\Traces\LongRunningQueries.xel') WITH (MAX_MEMORY = 4096 KB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY = 30 SECONDS, MAX_EVENT_SIZE = 0 KB, MEMORY_PARTITION_MODE = NONE, TRACK_CAUSALITY = OFF, STARTUP_STATE = OFF); ``

После создания сессию необходимо запустить: ALTER EVENT SESSION [LongRunningQueries] ON SERVER STATE = START;.

Применение

Extended Events используется для решения широкого круга задач:

Диагностика производительности

С помощью Extended Events можно выявить медленные запросы, блокировки, конфликты ресурсов (например, ожидания LCK_M_*), высокую загрузку CPU или диска. Анализируя события sql_statement_completed, sp_statement_completed и wait_completed, администратор может определить узкие места.

Мониторинг блокировок и взаимоблокировок

Событие sqlserver.lock_deadlock позволяет захватывать информацию о взаимоблокировках (deadlock), включая граф взаимоблокировки и текст запросов, участвующих в конфликте. Это эффективнее, чем использование флага трассировки 1222.

Аудит и безопасность

Extended Events может использоваться для отслеживания изменений в структуре базы данных (DDL-операции), попыток входа в систему (события login и logout), выполнения определённых команд (например, GRANT, REVOKE). Это дополняет, но не заменяет полноценный аудит SQL Server Audit.

Отладка приложений

Разработчики могут использовать Extended Events для трассировки вызовов хранимых процедур, функций и триггеров, чтобы понять, как приложение взаимодействует с базой данных.

Мониторинг расширенных событий

SQL Server предоставляет динамические представления (DMV) для мониторинга самих сессий Extended Events, такие как sys.dm_xe_sessions, sys.dm_xe_session_targets и sys.dm_xe_session_events. Они позволяют отслеживать количество собранных событий, размер буфера и ошибки.

Преимущества и недостатки

Преимущества

  • Низкое влияние на производительность: Extended Events спроектирована так, чтобы минимизировать накладные расходы, особенно при использовании фильтров. По данным Microsoft, нагрузка может быть на 90% ниже по сравнению с SQL Trace.
  • Гибкость: Возможность комбинировать события, действия и цели в любой конфигурации.
  • Масштабируемость: Поддержка большого количества одновременных сессий и событий.
  • Интеграция с современными инструментами: Данные из XEL-файлов могут быть проанализированы с помощью T-SQL (функция sys.fn_xe_file_target_read_file), а также импортированы в Power BI, Azure Data Studio или сторонние решения.
  • Безопасность: Сессии могут быть созданы с ограниченными правами (например, с помощью роли ALTER ANY EVENT SESSION).

Недостатки

  • Сложность настройки: Для новичков может быть сложно разобраться в большом количестве событий и параметров.
  • Отсутствие графического интерфейса в некоторых версиях: В ранних версиях (2008, 2008 R2) Extended Events была доступна только через T-SQL.
  • Ограниченная документация для некоторых событий: Не все события имеют подробное описание, особенно в старых версиях.
  • Не заменяет полностью SQL Trace: Некоторые события, доступные в SQL Trace, не имеют прямых аналогов в Extended Events (например, UserConfigurable).

Сравнение с SQL Trace

ХарактеристикаSQL TraceExtended Events
АрхитектураМонолитная, основана на хранимых процедурахМодульная, событийно-ориентированная
ПроизводительностьВысокая нагрузка при активном сбореНизкая нагрузка, особенно с фильтрами
ФильтрацияОграничена, фильтры применяются после сбораФильтрация на стороне ядра до сбора
Количество событийОколо 200Более 1000
ЦелиФайл (TRC), таблица, ProfilerФайл (XEL), кольцевой буфер, счётчик, ETW
ГибкостьНизкаяВысокая
Поддержка в новых версияхУстарела, не рекомендуется к использованиюАктивно развивается

Интересные факты

  • Extended Events использует формат XEL (XML Event Log), который является бинарным XML-файлом. Его можно открыть в SSMS или прочитать с помощью T-SQL.
  • В SQL Server 2016 и новее появилась возможность использовать Extended Events для мониторинга Always On Availability Groups, включая события, связанные с синхронизацией данных и переключением ролей.
  • Система Extended Events также доступна в Azure SQL Database и Azure SQL Managed Instance, хотя набор событий может отличаться от локальной версии.
  • В SQL Server 2022 была добавлена поддержка событий для мониторинга работы с памятью и новыми функциями, такими как Query Store и Intelligent Query Processing.

Источники

  • Microsoft Docs: «Extended Events» (SQL Server documentation)
  • Microsoft Docs: «CREATE EVENT SESSION (Transact-SQL
  • Microsoft Docs: «sys.dm_xe_sessions (Transact-SQL)»
  • Microsoft Docs: «Compare SQL Server Trace and Extended Events»
  • Microsoft Docs: «Use the system_health session»

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →