Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к:SQL Server
Azure SQL База данных
Azure SQL Управляемый экземпляр
SQL База данных в Microsoft Fabric
В этой статье объясняется, когда и как использовать целевые объекты расширенных событий. Для каждого целевого объекта в статье описывается:
- Его возможности сбора и подготовки отчетов о событиях
- Примеры сеансов мероприятий с использованием целевой аудитории
В следующей таблице описывается доступность каждого целевого типа на разных платформах SQL.
| Целевой тип | SQL Server | База данных Azure SQL и база данных SQL в платформе Fabric | Управляемый экземпляр SQL Azure |
|---|---|---|---|
| файл события | Да | Да | Да |
| кольцевой_буфер | Да | Да | Да |
| event_stream | Да | Да | Да |
| гистограмма | Да | Да | Да |
| счетчик_событий | Да | Да | Да |
| сопоставление_пар | Да | нет | нет |
| etw_classic_sync_target | Да | нет | нет |
Если не указано по-другому, целевые объекты обрабатывают данные, которые они получают асинхронно.
Чтобы использовать эту статью, выполните следующие действия.
- Ознакомьтесь с основами расширенных событий, как описано в кратком руководстве: расширенные события.
- Используйте последнюю версию SQL Server Management Studio (SSMS).
Целевой объект event_file
Целевой event_file объект записывает выходные данные сеанса событий из буферов памяти в файл диска или в большой двоичный объект в службе хранилища Azure.
Параметр в предложении
filenameуказываетсяADD TARGET. Расширение файла должно бытьxel.Выбранное имя файла используется системой в качестве префикса, к которому добавляется числовое значение на основе даты и времени, а затем
xelрасширение.При необходимости можно указать
MAX_FILE_SIZEпараметр. Он определяет максимальный размер в мегабайтах (МБ), в котором файл может расти до создания нового файла.При необходимости можно указать
MAX_ROLLOVER_FILESпараметр, чтобы выбрать максимальное количество файлов для хранения в файловой системе в дополнение к текущему файлу. Значение по умолчанию —UNLIMITED. При оценкеMAX_ROLLOVER_FILES, если количество файлов превышает настройкуMAX_ROLLOVER_FILES, удаляются старые файлы.
Это важно
В зависимости от событий, добавленных в сеанс, файлы, созданные event_file целевым объектом, могут содержать конфиденциальные данные. Внимательно просмотрите файловую систему и предоставьте разрешения на доступ к каталогу и отдельным .xel файлам, включая унаследованный доступ, чтобы избежать предоставления ненужного доступа на чтение. Следуйте принципу наименьших привилегий. Чтобы снизить риск сбора конфиденциальных данных непреднамеренно, избегайте длительных сеансов событий, если они могут собирать конфиденциальные данные.
Примечание.
База данных SQL Azure и Управляемый экземпляр SQL Azure поддерживают только большие двоичные объекты в службе хранилища Azure в качестве значения filename параметра.
event_file Пример кода для базы данных SQL Azure, базы данных SQL в Fabric или Управляемом экземпляре SQL Azure см. в статье "Создание сеанса событий с целевым объектом event_file в службе хранилища Azure".
Создание сеанса событий с целевым объектом event_file в локальной файловой системе
Пошаговое руководство по созданию сеанса событий с использованием event_file и локального хранилища файлов, с помощью SSMS или T-SQL, смотрите в кратком руководстве по расширенным событиям.
Создание сеанса событий с целевым объектом event_file в службе хранилища Azure
Подробное описание создания учетной записи хранения в службе хранилища Azure см. в статье "Создание учетной записи хранения". Вы можете создать учетную запись хранения с помощью портала Azure, PowerShell, SQL Azure, шаблона ARM или шаблона Bicep. Используйте учетную запись, которая:
- Является учетной записью
Standard general-purpose v2. -
HotИспользует уровень доступа BLOB. - При использовании SQL Server в виртуальной машине Azure (виртуальная машина Azure) учетная запись хранения должна находиться в том же регионе Azure, что и виртуальная машина Azure.
- Не включает иерархическое пространство имен .
Затем создайте контейнер в этой учетной записи хранилища с использованием портала Azure. Вы также можете создать контейнер с помощью PowerShell или с помощью Azure CLI.
Обратите внимание на имена созданной учетной записи хранения и контейнера . Они используются в следующих шагах.
Для чтения и записи данных о событиях ядро СУБД требует определенного доступа. Этот доступ предоставляется по-разному в зависимости от выбранного типа аутентификации: управляемая идентификация или аутентификация на основе секретов с помощью токена SAS (shared access signature).
Для проверки подлинности в службе хранилища Azure ядро СУБД требует учетных данных на уровне сервера или учетных данных с областью базы данных, которые сообщают о том, какой тип проверки подлинности следует использовать, и предоставляет секрет для проверки подлинности на основе секретов. Для создания этих учетных данных требуется CONTROL разрешение базы данных.
Для SQL Server и Управляемого master экземпляра SQL Azure это разрешение требуется в базе данных. По умолчанию разрешение предоставляется членами db_owner роли master базы данных, и членами sysadmin роли сервера на экземпляре. Для базы данных SQL Azure и базы данных SQL в Fabric это разрешение хранится владельцем базы данных (dbo), членами db_owner роли базы данных и администратором логического сервера.
После создания учетных данных, остальные действия для создания сеанса событий не требуют CONTROL разрешения. Ознакомьтесь с разрешениями, которые необходимы.
Предоставление доступа с помощью управляемого удостоверения
При использовании управляемого удостоверения с аутентификацией Microsoft Entra вы назначаете управляемому удостоверению, используемому ядром СУБД, роль участника RBAC хранилища BLOB-объектов для контейнера. Дополнительные сведения см. в следующих статьях на основе платформы SQL:
- Управляемое удостоверение логического сервера базы данных SQL Azure.
- Управляемое удостоверение управляемого экземпляра SQL Azure.
- Управляемое удостоверение для виртуальной машины Azure, которая размещает ваш экземпляр SQL Server. Дополнительные сведения см. в статье о том, как управляемые удостоверения для ресурсов Azure работают с виртуальными машинами Azure.
- Управляемое удостоверение экземпляра SQL Server с поддержкой Arc.
После назначения роли RBAC выполните следующие действия.
Создайте учетные данные с помощью T-SQL.
Перед выполнением следующего пакета T-SQL сделайте следующее изменение:
- Во всех трех случаях
https://<storage-account-name>.blob.core.windows.net/<container-name>замените<storage-account-name>на имя вашей учетной записи хранения, а<container-name>на имя вашего контейнера. Убедитесь, что косая черта в конце URL-адреса отсутствует.
Создание учетных данных на уровне сервера: (применяется к SQL Server, Управляемому экземпляру SQL Azure)
Используя клиентское средство, например SSMS, откройте новое окно запроса, подключитесь к
masterбазе данных в экземпляре, где требуется создать сеанс событий, и вставьте следующий пакет T-SQL./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';Создать учетные данные для базы данных: (применяется к базе данных Azure SQL, управляемому экземпляру Azure SQL, базе данных SQL в Fabric)
Используя клиентское средство, например SSMS, откройте новое окно запроса, подключитесь к пользовательской базе данных, где создается сеанс событий, и вставьте следующий пакет T-SQL. Убедитесь, что вы подключены к пользовательской базе данных, а не к
masterбазе данных./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';- Во всех трех случаях
Затем выполните действия, чтобы создать сеанс событий в SSMS с event_file целевым объектом в службе хранилища Azure.
Предоставьте доступ с помощью маркера подписанного доступа (SAS)
При использовании аутентификации на основе секретов создается токен SAS для контейнера. Чтобы использовать этот тип проверки подлинности, для учетной записи хранения необходимо включить параметр "Разрешить доступ к ключу учетной записи хранения ". Дополнительные сведения см. в статье Предотвращение авторизации с общим ключом для учетной записи службы хранения Azure.
На портале Azure перейдите к созданной учетной записи хранения и контейнеру. Выберите контейнер и перейдите к Параметры > маркеры общего доступа.
Маркер SAS должен соответствовать следующим требованиям:
-
Разрешения, заданные в
Read,Write,DeleteList. - Время начала и срок действия должны охватывать время существования сеанса событий. Создаваемый маркер SAS работает только в течение этого интервала времени.
- Для Базы данных SQL Azure, Управляемого экземпляра SQL Azure и базы данных SQL в Fabric маркер SAS не должен иметь ограничений ip-адресов.
Нажмите кнопку "Создать маркер SAS" и "URL-адрес ". Маркер SAS находится в поле SAS-токена BLOB. Его можно скопировать, чтобы использовать на следующем шаге.
Это важно
Маркер SAS предоставляет доступ для чтения и записи к этому контейнеру. Обработайте его так, как вы будете относиться к паролю или любому другому секрету.
-
Разрешения, заданные в
Создайте учетные данные для хранения маркера SAS с помощью T-SQL.
Перед выполнением следующего пакета T-SQL внесите следующие изменения:
При создании учетных данных на уровне сервера и использовании
CREATE MASTER KEYинструкции замените<password>на надежный пароль, который защищает главный ключ. Дополнительные сведения см. в статье CREATE MASTER KEY.Во всех трех случаях
https://<storage-account-name>.blob.core.windows.net/<container-name>замените<storage-account-name>на имя вашей учетной записи хранения, а<container-name>на имя вашего контейнера.В предложении
SECRETзамените<sas-token>маркер SAS, скопированный на предыдущем шаге.
Создание учетных данных на уровне сервера: (применяется к SQL Server, Управляемому экземпляру SQL Azure)
Используя клиентское средство, например SSMS, откройте новое окно запроса, подключите его к
masterбазе данных в экземпляре, где создается сеанс событий, и вставьте следующий пакет T-SQL./* Create a master key to protect the secret of the credential */ IF NOT EXISTS (SELECT 1 FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##') CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>' /* The name of the credential must match the URL of the blob container. */; IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';Создать учетные данные для базы данных: (применяется к базе данных Azure SQL, управляемому экземпляру Azure SQL, базе данных SQL в Fabric)
Используя клиентское средство, например SSMS, откройте новое окно запроса, подключитесь к базе данных, в которой создается сеанс событий, и вставьте следующий пакет T-SQL. Убедитесь, что вы подключены к пользовательской базе данных, а не к
masterбазе данных./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';Затем выполните действия, описанные в следующем разделе, чтобы создать сеанс событий в SSMS с целевым объектом event_file в службе хранилища Azure.
Создание сеанса событий в SSMS с целевым объектом event_file в службе хранилища Azure
После создания учетных данных, предоставляющих доступ к контейнеру хранилища, можно создать сеанс событий. В отличие от создания учетных данных, создание сеанса событий не требует CONTROL разрешения. После создания учетных данных можно создать сеансы событий, даже если у вас есть более ограниченные разрешения. Ознакомьтесь с разрешениями, которые необходимы.
Чтобы создать новый сеанс событий в SSMS, выполните приведенные действия.
Для SQL Server и службы управляемых экземпляров Azure SQL разверните узел Расширенные события в папке «Управление». Для базы данных Azure SQL и базы данных SQL в Fabric разверните узел Extended Events в разделе базы данных.
Щелкните правой кнопкой мыши папку "Сеансы" и выберите "Создать сеанс...".
На странице «Общие» введите имя сеанса, которое используется в следующем примере кода.
На странице "События" выберите одно или несколько событий, которые нужно добавить в сеанс. Например, можно выбрать
sql_batch_startingсобытие.На странице хранилища данных выберите
event_fileцелевой тип. Вставьте URL-адрес контейнера хранилища в поле URL-адреса хранилища . Введите косую черту/() в конце этого URL-адреса, а затем имя файла (BLOB-объекта). Например:https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.Теперь, когда сеанс настроен, можно при необходимости выбрать кнопку "Скрипт ", чтобы создать скрипт T-SQL сеанса, чтобы сохранить его позже.
Нажмите кнопку "ОК ", чтобы создать сеанс.
В обозреватель объектов разверните папку Session, чтобы увидеть созданный сеанс событий. По умолчанию сеанс не запускается при его создании. Чтобы запустить сеанс, щелкните правой кнопкой мыши имя сеанса и выберите "Пуск сеанса". Позже его можно остановить, нажав кнопку "Остановить сеанс " после запуска сеанса.
При выполнении пакетов T-SQL сеанс записывает sql_batch_starting события в example-session.xel blob в контейнере хранилища.
Примечание.
Для Управляемый экземпляр SQL вместо вставки URL-адреса контейнера хранилища на странице хранилища данных нажмите кнопку "Скрипт", чтобы создать скрипт T-SQL сеанса. Укажите URL-адрес контейнера в качестве значения аргумента filename и выполните скрипт для создания сеанса.
Создание сеанса событий с целевым объектом event_file в службе хранилища Azure в T-SQL
Ниже приведен пример CREATE EVENT SESSIONADD TARGET предложения, который добавляет целевой объект на основе event_file службы хранилища Azure.
CREATE EVENT SESSION [example-session]
ON SERVER
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.event_file
(
SET filename = N'https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel'
)
GO
Чтобы использовать этот пример в Базе данных SQL Azure или базе данных SQL в Fabric, замените ON SERVER на ON DATABASE.
Устранение неполадок сеансов событий с помощью целевого объекта event_file в службе хранилища Azure
В следующем списке содержатся ошибки, которые могут возникнуть при запуске расширенного сеанса событий, использующего службу хранилища Azure, с возможными объяснениями ошибки.
-
Операционная система вернула ошибку 5: "Доступ запрещен".
- При использовании проверки подлинности управляемого удостоверения:
- Управляемое удостоверение, используемое ядром СУБД, не имеет требуемого назначения роли RBAC. Дополнительные сведения см. в разделе "Предоставление доступа с помощью управляемого удостоверения",.
- Брандмауэр учетной записи хранилища включен, и включено исключение для допуска доверенных служб Azure к учетной записи хранилища, но экземпляр ресурса для логического сервера не добавлен в список экземпляров ресурсов, которым предоставлен доступ. Дополнительные сведения см. в статье "Предоставление доступа из экземпляров ресурсов Azure".
- При использовании периметра безопасности сети с принудительным режимом база данных и учетная запись хранения не в одном периметре.
- При использовании проверки подлинности маркера SAS:
- Учетная запись хранения брандмауэр включен. Это не поддерживается для сеансов событий, которые используют аутентификацию с помощью токена SAS.
- Маркер SAS не имеет достаточных разрешений или истёк. Дополнительные сведения см. в разделе "Предоставление доступа с помощью маркера SAS".
- При использовании периметра безопасности сети с режимом принудительного выполнения, правила доступа не настроены для разрешения неограниченного исходящего трафика от базы данных и неограниченного входящего трафика к учетной записи хранения.
- При использовании проверки подлинности управляемого удостоверения:
-
Операционная система вернула ошибку 86: "Указанный сетевой пароль не правильный".
- Нет учетных данных с областью базы данных (для базы данных SQL Azure) или учетных данных на уровне сервера (для Управляемого экземпляра SQL Azure или SQL Server) с именем, соответствующим URL контейнера BLOB-объектов. Для получения дополнительной информации ознакомьтесь с примерами предоставления доступа с помощью управляемого удостоверения или предоставления доступа с помощью SAS-токена.
- Имя учетных данных заканчивается косой чертой (
/). Имя учетных данных должно заканчиваться именем контейнера, не включая косую черту.
-
Операционная система вернула ошибку 3: "Система не может найти указанный путь".
- Контейнер, указанный в URL-адресе контейнера BLOB-объектов, не существует.
-
Операционная система вернула ошибку 13: "Недопустимые данные".
- В контейнере BLOB установлена политика неизменяемости. Неизменяемое хранилище не поддерживается для сеансов событий.
- Учетная запись хранения включает иерархическое пространство имен . Учетные записи хранения с включенным иерархическим пространством имен не поддерживаются для сеансов событий.
функция sys.fn_xe_file_target_read_file()
Целевой event_file объект сохраняет данные, которые он получает в двоичном формате, который не является удобочитаемым. Функция sys.fn_xe_file_target_read_file позволяет представить содержимое файла в виде реляционного xel набора строк. Дополнительные сведения, включая примеры использования, см. sys.fn_xe_file_target_read_file.
Целевой объект ring_buffer
Целевой ring_buffer объект полезен для быстрого запуска сеанса событий и сбора данных о событиях только в памяти. Когда доступная память в кольцевом буфере используется событиями, старые события удаляются. При остановке сеанса событий все выходные данные сеанса к целевому объекту ring_buffer также удаляются.
Данные из целевого ring_buffer объекта используются путем преобразования в XML, как показано в следующем примере. Во время этого преобразования все данные, которые не помещаются в XML-документ размером 4 МБ, опущены. Таким образом, даже если вы фиксируете больше событий в буфере кольца, используя большие MAX_MEMORY значения (или оставив этот параметр по умолчанию), вы можете не использовать все из-за ограничения в 4 МБ на размер XML-документа, учитывая затраты на разметку XML и строки Юникода.
Известно, что содержимое буфера кольца опущено во время преобразования в XML, если truncated атрибут в XML-документе имеет значение 1, например:
<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">
Совет
При добавлении целевого ring_buffer объекта задайте для параметра MAX_MEMORY значение 1024 КБ или меньше. Использование больших значений может ненужно увеличить потребление памяти.
По умолчанию MAX_MEMORY для ring_buffer целевого объекта не ограничено в SQL Server, а ограничено до 32 МБ в Azure SQL Database, Azure SQL Managed Instance и базе данных SQL в Fabric.
Создание сеанса событий с целевым объектом ring_buffer
Ниже приведен пример создания сеанса событий с ring_buffer целевым объектом для сбора lock_acquired событий, ограничивающего общее количество событий в кольцевом буфере до 100. В этом примере MAX_MEMORY параметр появляется дважды: один раз, чтобы задать целевую память размером 1024 КБ, а затем один раз, чтобы задать ring_buffer память буфера сеанса событий 2 МБ.
Чтобы использовать этот пример в Базе данных SQL Azure или базе данных SQL в Fabric, замените ON SERVER на ON DATABASE.
CREATE EVENT SESSION ring_buffer_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.ring_buffer
(
SET MAX_EVENTS_LIMIT = 100,
MAX_MEMORY = 1024
)
WITH
(
MAX_MEMORY = 2 MB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
Чтобы запустить сеанс событий, выполните следующую инструкцию:
ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;
Чтобы просмотреть собранные данные о событиях в кольцевом буфере в SSMS, разверните узел сеанса и выберите целевой объект package0.ping_buffer. Данные отображаются в ФОРМАТЕ XML.
Чтобы просмотреть данные событий из целевого ring_buffer объекта в реляционном наборе строк во время активности сеанса, используйте выражения XQuery для преобразования XML в реляционные данные. Рассмотрим пример.
;WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST (xst.target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets AS xst
INNER JOIN sys.dm_xe_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'ring_buffer_lock_acquired'
),
/* A row for each event in the buffer, represented as an XML fragment */
EventNode AS
(
SELECT CAST (NodeData.query('.') AS XML) AS EventInfo
FROM RingBuffer AS rb
CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData)
)
/* A relational rowset formed by using the XQuery value method */
SELECT EventInfo.value('(event/@timestamp)[1]','datetimeoffset') AS timestamp,
EventInfo.value('(event/@name)[1]','sysname') AS event_name,
EventInfo.value('(event/data/value)[1]','nvarchar(max)') AS sql_batch_text
FROM EventNode
ORDER BY timestamp DESC;
целевой объект event_stream
Целевой event_stream объект можно использовать только в программах .NET, написанных на таких языках, как C#. Разработчики могут получить доступ к потоку событий через классы .NET Framework в Microsoft.SqlServer.XEvents.Linq пространстве имен. Этот целевой объект неявно присутствует в любом сеансе событий. Его нельзя добавить с помощью T-SQL.
Дополнительные сведения см. в sys.fn_MSxe_read_event_stream.
Если при чтении из целевого The event data stream was disconnected because there were too many outstanding events. To avoid this error either remove events or actions from your session or add a more restrictive predicate filter to your session. объекта возникает ошибка 25726, event_stream это означает, что поток событий заполняется данными быстрее, чем клиент может использовать данные. Это приводит к отключению ядро СУБД от потока событий, чтобы избежать влияния на производительность ядро СУБД.
целевой объект histogram
Целевой histogram объект подсчитывает количество вхождений событий для различных значений в поле или действии. Для каждого отдельного значения используется отдельный контейнер счетчиков. Целевой histogram объект обрабатывает данные, которые он получает синхронно.
Параметр SOURCE_TYPE управляет поведением целевого histogram объекта:
-
SOURCE_TYPE = 0: сбор данных для поля события. -
SOURCE_TYPE = 1: сбор данных для действия. Это значение по умолчанию.
Значение SLOTS по умолчанию параметра равно 256. Если назначить другое значение, оно округляется вверх до следующей степени 2. Например, SLOTS = 59 округляется до 64. Максимальное количество слотов гистограммы для целевого histogram объекта — 16 384.
При использовании histogram в качестве целевого объекта иногда могут отображаться непредвиденные результаты. Некоторые события могут не отображаться в ожидаемых слотах, а другие слоты могут отображаться выше ожидаемого количества событий. Это может произойти, если при назначении событий в слотах возникает хэш-столкновение. Хотя это редко, если возникает хэш-столкновение, событие, которое должно быть подсчитано в одном слоте, учитывается в другом. По этой причине следует учитывать, что событие не произошло только потому, что количество в определенном слоте отображается как ноль.
Давайте рассмотрим следующий пример:
- Вы настраиваете сеанс расширенных событий, используя
histogramв качестве целевого и распределяя события поobject_id, для сбора статистики выполнения хранимых процедур. - Вы выполняете хранимую процедуру
A. Затем выполняется хранимая процедураB.
Если хэш-функция возвращает одно и то же значение для object_id обоих хранимых процедур, гистограмма показывает, что A выполняется дважды, тогда как B не появляется.
Чтобы устранить эту проблему, если количество уникальных значений относительно небольшое, задайте количество слотов гистограммы выше квадрата ожидаемых уникальных значений. Например, если целевой histogram объект имеет свой SOURCE набор table_name в поле события, а в базе данных есть 20 таблиц, то 20*20 = 400. Следующая мощность 2 больше 400 — 512, что является рекомендуемыми числами слотов в этом примере.
Каждый histogram целевой объект принимает данные из одного источника (поля события или действия) и содержит только одну гистограмму. Невозможно добавить несколько целевых объектов одного типа на сеанс событий. Кроме того, для каждого целевого объекта невозможно иметь несколько типов histogram источника. Поэтому для отслеживания различных действий или полей событий в отдельном histogram целевом объекте требуется новый сеанс событий.
Создание сеанса событий с целевым объектом гистограммы
Ниже приведен пример создания сеанса событий с целевым histogram объектом.
Чтобы использовать этот пример в Базе данных SQL Azure или базе данных SQL в Fabric, замените ON SERVER на ON DATABASE.
CREATE EVENT SESSION histogram_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
ACTION (sqlos.system_thread_id)
)
ADD TARGET package0.histogram
(
SET FILTERING_EVENT_NAME = N'sqlserver.lock_acquired',
SLOTS = 16,
SOURCE = N'sqlos.system_thread_id',
SOURCE_TYPE = 1
);
В предложении ADD TARGET ... (SET ...) целевой параметр SOURCE_TYPE установлен в значение 1, что означает, что histogram отслеживает действие.
Предложение ADD EVENT ... (ACTION ...) добавляет sqlos.system_thread_id действие в событие. Параметр SOURCE устанавливается на sqlos.system_thread_id, чтобы использовать идентификатор системного потока, собираемый этим действием, в качестве источника данных для целевого объекта histogram. Целевой histogram объект в этом примере подсчитывает количество событий для каждого системного lock_acquired потока, получающего блокировки во время активности сеанса.
Чтобы запустить сеанс событий, выполните следующую инструкцию:
ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;
Чтобы просмотреть собранные данные гистограммы в SSMS, разверните узел сеанса и выберите целевой package0.histogram объект. Данные отображаются в сетке с двумя столбцами. Каждая строка представляет собой группу отдельных значений и количество вхождений.
Вот как могут выглядеть данные, захваченные целевым histogram объектом в этом примере. Значения в столбце value — это system_thread_id значения. Например, в общей сложности 236 блокировок были захвачены системным потоком 6540.
value count
----- -----
6540 236
9308 91
9668 74
10144 49
5244 44
2396 28
Ниже приведен пример чтения данных из целевого histogram объекта с помощью T-SQL:
WITH histogram_target
AS (SELECT TRY_CAST (st.target_data AS XML) AS target_data
FROM sys.dm_xe_sessions AS s
INNER JOIN sys.dm_xe_session_targets AS st
ON s.address = st.event_session_address
WHERE s.name = 'event-session-name-placeholder'),
histogram
AS (SELECT hb.slot.value('(@count)[1]', 'bigint') AS slot_count,
hb.slot.value('(value/text())[1]', 'nvarchar(max)') AS slot_value
FROM histogram_target AS ht
CROSS APPLY ht.target_data.nodes('/HistogramTarget/Slot') AS hb(slot))
SELECT slot_value,
slot_count
FROM histogram;
Целевой объект event_counter
Целевой event_counter объект рассчитывает, сколько раз происходит каждое указанное событие.
Целевой event_counter объект не имеет параметров и обрабатывает данные, которые он получает синхронно.
Создать сеанс событий с целевым объектом "event_counter"
Ниже приведен пример создания сеанса событий с целевым event_counter объектом. Сеанс подсчитывает первые четыре checkpoint_begin события, а затем останавливает подсчет, так как его предикат ограничивает количество событий, отправленных целевым объектам до четырех. Чтобы создать checkpoint_begin событие для этого примера, выполните CHECKPOINT команду.
Чтобы использовать этот пример в Базе данных SQL Azure или базе данных SQL в Fabric, замените ON SERVER на ON DATABASE.
CREATE EVENT SESSION event_counter_checkpoint_begin
ON SERVER
ADD EVENT sqlserver.checkpoint_begin
(
WHERE package0.counter <= 4
)
ADD TARGET package0.event_counter
WITH
(
MAX_MEMORY = 4096 KB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
Чтобы запустить сеанс событий, выполните следующую инструкцию:
ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;
Чтобы просмотреть собранные данные в SSMS, разверните узел сеанса и выберите целевой package0.event_counter объект. Данные отображаются в сетке с тремя столбцами. Каждая строка представляет событие с количеством раз, когда оно произошло.
Вот как данные, захваченные целевым event_counter объектом в этом примере, могут выглядеть после четырех контрольных точек.
package_name event_name count
------------ ---------------- -----
sqlserver checkpoint_begin 4
Целевой объект pair_matching
Целевой pair_matching объект позволяет обнаруживать события запуска, которые происходят без соответствующего конечного события. Например, можно найти lock_acquired событие без соответствующего lock_released события, что может указывать на то, что долго выполняющаяся транзакция держит блокировки.
Расширенные события не совпадают автоматически с событиями начала и окончания. Вместо этого вы определяете логику сопоставления в целевой pair_matching спецификации в инструкции CREATE EVENT SESSION . Когда события начала и конца сопоставляются, целевая система удаляет пару, но сохраняет несопоставленные события начала.
Создание сеанса событий с целевым объектом pair_matching
В этом примере мы создадим пример таблицы с именем T1, вставим три строки и получаем object_id значение для этой таблицы. Для простоты мы создадим таблицу tempdb в базе данных в этом примере. Если вы используете другую базу данных, измените имя базы данных в приведенном ниже примере кода T-SQL.
CREATE TABLE T1 (id INT PRIMARY KEY);
INSERT INTO T1 (id)
VALUES (1), (2), (3);
SELECT OBJECT_ID('T1') AS object_id;
-- object_id = 1029578706
Следующий сеанс событий включает в себя два события: lock_acquired и lock_released. Он также имеет два целевых объекта. Одним из них является целевой объект event_counter, который предоставляет количество вхождений для каждого события. Другой — это целевой pair_matching объект, определяющий логику для сопоставления события начала lock_acquired и конечного lock_released события в парах.
Последовательность полей с разделителями-запятыми, назначенных BEGIN_MATCHING_COLUMNS и END_MATCHING_COLUMNS должна быть одинаковой. Между полями, упомянутыми в значении с разделителями-запятыми, не допускаются вкладки или новые линии, хотя пробелы разрешены.
В определении сеанса событий мы используем предикат события для сбора только тех событий в tempdb базе данных, где object_id событие соответствует идентификатору объекта таблицы T1. Измените предикат в WHERE предложении, чтобы использовать идентификатор объекта таблицы.
Чтобы использовать этот пример в Базе данных SQL Azure или базе данных SQL в Fabric, замените ON SERVER на ON DATABASE.
CREATE EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
SET COLLECT_DATABASE_NAME = 1,
COLLECT_RESOURCE_DESCRIPTION = 1
ACTION (sqlserver.transaction_id)
WHERE (database_name = 'tempdb'
AND object_id = 1029578706)
),
ADD EVENT sqlserver.lock_released
(
SET COLLECT_DATABASE_NAME = 1,
COLLECT_RESOURCE_DESCRIPTION = 1
ACTION (sqlserver.transaction_id)
WHERE (database_name = 'tempdb'
AND object_id = 1029578706)
)
ADD TARGET package0.event_counter,
ADD TARGET package0.pair_matching
(
SET BEGIN_EVENT = N'sqlserver.lock_acquired',
BEGIN_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
END_EVENT = N'sqlserver.lock_released',
END_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
RESPOND_TO_MEMORY_PRESSURE = 1
)
WITH
(
MAX_MEMORY = 8192 KB,
MAX_DISPATCH_LATENCY = 15 SECONDS
);
Чтобы запустить сеанс событий, выполните следующую инструкцию:
ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;
Начните транзакцию, которая обновляет таблицу T1, но не фиксируйте её и не откатывайте. Это гарантирует, что блокировки приобретены, но не сняты.
BEGIN TRANSACTION;
UPDATE T1
SET id = id + 1;
Проверьте выходные данные каждого целевого объекта сеанса pair_matching_lock_acquired_released событий в SSMS.
У объекта event_counter следующие выходные данные, указывающие на то, что одна блокировка остается не освобождена. Однако этот целевой объект не отображает никаких сведений об этой блокировке.
package_name event_name count
------------ ---------- -----
sqlserver lock_acquired 4
sqlserver lock_released 3
Целевой pair_matching объект имеет следующие выходные данные, усеченные для краткости. Как показано в выходных event_counter данных, мы действительно видим одну строку для непарного lock_acquired события с дополнительными сведениями о событии.
package_name event_name timestamp associated_object_id database_id database_name
------------ ------------ --------- ------------- ----------- -------------
sqlserver lock_acquired 2025-10-01 20:06:07.1890000 1029578706 2 tempdb
Выполните откат транзакции.
ROLLBACK;
При добавлении действия в событие, собираемое целевым pair_matching объектом, данные действия также собираются. Например, можно включить текст T-SQL, предоставленный действием sqlserver.sql_text для события. В этом примере он собирает запрос, полученный блокировкой.
Целевой объект etw_classic_sync_target
В SQL Server расширенные события могут взаимодействовать с трассировкой событий для Windows (ETW) для мониторинга системных действий. Дополнительные сведения см. в разделе:
- Трассировка событий для целевого объекта Windows
- Мониторинг активности системы с помощью расширенных событий
Этот целевой объект ETW обрабатывает данные, которые он получает синхронно.