扩展事件概述

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

使用扩展事件 (XEvents) 体系结构,用户可根据监视、识别或故障排除 SQL Server、Azure SQL 数据库和 Azure SQL 托管实例的性能所需的尽可能多或尽可能少的数据。 扩展事件可进行高度可配置、体量轻,并可以很好地缩放。 有关详细信息,请参阅扩展事件体系结构

扩展事件将替代弃用的 SQL 跟踪和 SQL Server Profiler 功能。

若要开始使用扩展事件,请使用快速入门:扩展事件

注意

如果使用的是 Azure SQL,则了解 Azure SQL 数据库和 SQL 托管实例代码示例的不同之处,以及有关 Azure SQL 数据库中的扩展事件的更多信息。

扩展事件的优点

扩展事件是一种轻量级性能监视系统,使用最少的系统资源,同时提供详细、深度的数据库引擎视图。 SQL Server Management Studio 提供了一个图形用户界面,供扩展事件用于创建、修改和放置事件会话以及显示和分析会话数据。 若要了解 Management Studio 中扩展事件支持的详细信息,请参阅:

扩展事件概念

扩展事件建立在 Windows 事件跟踪的现有概念之上(例如事件事件使用者),同时引入了操作谓词等新的概念。

下表提供了文档引用,可帮助了解扩展事件中的概念。

文章 说明
扩展事件包 描述包含对象的扩展事件包。 这些对象用于在扩展事件会话运行时获取和处理数据。
扩展事件的目标 介绍了在事件会话期间可接收数据的事件使用者。
扩展事件引擎 介绍了可实现和管理扩展事件会话的引擎。
扩展事件会话 介绍了扩展事件会话。

扩展事件体系结构

扩展事件是我们所谓的用于服务器系统的常规事件处理系统。 扩展事件基础结构支持数据库引擎中数据的关联,并且在某些情况下,还支持操作系统和数据库应用程序中数据的关联。 如果是在操作系统中,必须将扩展事件输出定向到 Windows 事件跟踪 (ETW)。 ETW 可将事件数据与操作系统或应用程序事件数据相关联。

所有应用程序都具有在应用程序外部和内部均有用的执行点。 在应用程序内部,可以使用任务初始执行期间收集到的信息对异步处理进行排队。 在应用程序外部,执行点为监视实用程序提供信息。 此信息涉及受监视应用程序的行为和性能特征。

扩展事件支持在进程外部使用事件数据。 此数据通常由通过性能监视来管理或支持产品或出于调试目的为某个产品开发应用程序的用户使用。 数据通过使用 XEvent 探查器和性能监视器、T-SQL 或 Windows 命令行等工具(如 SQL Server Management Studio)来进行利用或分析。

扩展事件的设计涉及以下主要方面:

  • 扩展事件引擎是不识别事件的。 因此,该引擎可以将任何事件绑定到任何目标,因为该引擎不受事件内容约束。 有关扩展事件引擎的详细信息,请参阅扩展事件引擎
  • 事件与事件使用者不同,后者在扩展事件中称为“目标”。 也就是说任何目标可以接收任何事件。 此外,引发的任何事件均可供目标自动使用,这样可以记录或提供额外的事件上下文。 有关详细信息,请参阅扩展事件的目标
  • 事件不同于在事件发生时要执行的操作。 因此,任何操作可以与任何事件相关联。
  • 谓词可以在应捕获事件数据时动态进行筛选。 动态筛选增加了扩展事件基础结构的灵活性。 有关详细信息,请参阅扩展事件包

扩展事件可以同步生成事件数据(并异步处理该数据),这为事件处理提供了灵活的解决方案。 此外,扩展事件提供以下功能:

  • 一种跨服务器系统处理事件的统一方法,同时使用户可以隔离特定的事件进行故障排除。
  • 与现有的 ETW 工具集成并支持现有的 ETW 工具。
  • 使用 Transact-SQL 的完全可配置的事件处理机制。
  • 可以动态监视活动进程,同时对这些进程的影响最小。
  • 运行时不会对性能造成任何明显影响的默认系统运行状况会话。 该会话收集的系统数据可用于帮助解决性能问题。 有关详细信息,请参阅 使用 system_health 会话

扩展事件任务

通过使用 Management Studio 或 Transact-SQL 来执行 Transact-SQL 数据定义语言 (DDL) 语句、利用动态管理视图和功能或目录视图,可以针对 SQL Server 环境创建简单或复杂的 SQL Server 扩展事件排除故障解决方案。

任务说明 文章
使用 “对象资源管理器” 管理事件会话。 在对象资源管理器中管理事件会话
介绍如何创建扩展事件会话。 扩展事件会话
介绍如何查看和刷新目标数据。 在 SQL Server Management Studio 中查看事件数据
介绍如何使用扩展事件工具创建和管理 扩展事件会话。 扩展事件工具
介绍如何更改扩展事件会话。 更改扩展事件会话
介绍如何获取与事件关联的字段的信息。 获取所有事件的字段
介绍如何找到在已注册的包中有哪些事件可用。 SQL Server 中扩展事件系统视图中的 SELECT 和 JOIN
介绍如何确定在已注册的包中有哪些扩展事件目标可用。 扩展事件的目标
介绍如何查看与各 SQL 跟踪事件及其关联列等效的扩展事件和操作。 查看与 SQL 跟踪事件类等效的扩展事件
介绍在 CREATE EVENT SESSIONALTER EVENT SESSION 语句中使用 ADD TARGET 子句时,如何查找可以设置的参数。 扩展事件的目标
介绍如何将现有 SQL 跟踪脚本转换为扩展事件会话。 将现有 SQL 跟踪脚本转换为扩展事件会话
介绍如何确定持有锁的查询、查询的计划以及取锁时的 Transact-SQL 堆栈。 确定持有锁的查询
介绍如何识别锁定的来源。 查找具有最多锁定的对象
介绍如何将扩展事件和 Windows 事件跟踪配合使用来监视系统活动。 使用扩展事件监视系统活动
为扩展事件使用目录视图和动态管理视图 (DMV) SQL Server 中扩展事件系统视图中的 SELECT 和 JOIN

使用以下 T-SQL 查询返回所有可能的扩展事件及其说明:

SELECT obj1.name AS [XEvent-name],
    col2.name AS [XEvent-column],
    obj1.description AS [Descr-name],
    col2.description AS [Descr-column]
FROM sys.dm_xe_objects AS obj1
INNER JOIN sys.dm_xe_object_columns AS col2
    ON col2.object_name = obj1.name
ORDER BY obj1.name,
    col2.name

Azure SQL 数据库和 SQL 托管实例的代码示例可能有所不同

为 SQL Server 编写的一些 Transact-SQL 代码示例需要少量更改才能在 Azure 中运行。 此类代码示例的其中一个类别涉及目录视图,其名称前缀因数据库引擎类型而异:

  • server_ - SQL Server 和 Azure SQL 托管实例的前缀
  • database_ - Azure SQL 数据库和 SQL 托管实例的前缀

Azure SQL 数据库仅支持数据库范围的事件会话。 SQL Server Management Studio (SSMS) 完全支持 Azure SQL 数据库的数据库范围事件会话:包含数据库范围会话的“扩展事件”节点显示在对象资源管理器中的每个数据库下。

Azure SQL 托管实例既支持数据库范围的会话,也支持服务器范围的会话。 SSMS 完全支持 SQL 托管实例的服务器范围的会话:包含所有服务器范围的会话的“扩展事件”节点显示在对象资源管理器中每个托管实例的“管理”文件夹下。

注意

对于托管实例,建议使用服务器范围的会话。 数据库范围的会话不显示在 Azure SQL 托管实例的 SSMS 中的对象资源管理器中。 使用托管实例时,只能使用 Transact-SQL 查询和管理数据库范围的会话。

为便于说明,下表列出并比较了目录视图的两个子集。 为简洁起见,将子集限制为也包含字符串 _event 的视图名称。 这些子集具有不同的名称前缀,因为它们支持不同的数据库引擎类型。

SQL Server 和 Azure SQL 托管实例中的名称 Azure SQL 数据库和 Azure SQL 托管实例中的名称
server_event_notifications
server_event_session_actions
server_event_session_events
server_event_session_fields
server_event_session_targets
server_event_sessions
server_events
server_trigger_events
database_event_session_actions
database_event_session_events
database_event_session_fields
database_event_session_targets
database_event_sessions

上表中的两个列表精确到 2022 年 3 月。 若要获得最新列表,请运行以下 Transact-SQL SELECT 语句:

SELECT name
    FROM sys.all_objects
    WHERE
        (name LIKE 'database[_]%' OR
         name LIKE 'server[_]%' )
        AND name LIKE '%[_]event%'
        AND type = 'V'
        AND SCHEMA_NAME(schema_id) = 'sys'
    ORDER BY name;