通过


扩展事件概述

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

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

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

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

注意

对于 Azure SQL 数据库、Fabric 中的 SQL 数据库和 SQL 托管实例, 代码示例可能会有所不同 ,因为目标的文件 event_file 存储在 Azure 存储中。 有关详细信息,请参阅 Azure SQL 中的扩展事件

扩展事件的优点

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

扩展事件概念

扩展事件基于 Windows 事件跟踪(ETW)中的现有概念(例如事件事件消费者),并引入了动作谓词等新概念。

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

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

扩展事件体系结构

扩展事件是我们所谓的用于服务器系统的常规事件处理系统。 扩展事件基础结构支持数据库引擎中数据的关联,并且在某些情况下,还支持操作系统和数据库应用程序中数据的关联。 如果是在操作系统中,必须将扩展事件输出定向到 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 中查看事件数据
介绍扩展事件会话的体系结构。 扩展事件会话
介绍如何使用扩展事件工具创建和管理 扩展事件会话。 扩展事件工具
介绍如何更改扩展事件会话。 更改扩展事件会话
介绍如何获取与事件关联的字段的信息。 获取所有事件的字段
介绍如何找到在已注册的包中有哪些事件可用。 扩展事件的系统视图中的SELECT 和 JON
介绍如何查看与各 SQL 跟踪事件及其关联列等效的扩展事件和操作。 查看与 SQL 跟踪事件类等效的扩展事件
介绍如何将现有 SQL 跟踪脚本转换为扩展事件会话。 将现有 SQL 跟踪脚本转换为扩展事件会话
介绍如何确定持有锁的查询、查询的计划以及取锁时的 Transact-SQL 堆栈。 确定持有锁的查询
介绍如何识别锁定的来源。 查找具有最多锁定的对象
介绍如何将扩展事件和 Windows 事件跟踪配合使用来监视系统活动。 使用扩展事件监视系统活动
为扩展事件使用目录视图和动态管理视图 (DMV) 扩展事件的系统视图中的SELECT 和 JON

扩展事件目录视图

扩展事件提供多个目录视图。 目录视图告知事件会话 元数据定义。 有关活动事件会话实例的信息,请参阅 扩展事件动态管理视图

目录视图名称 说明
sys.database_event_session_actions 针对数据库范围事件会话的每个事件的每个操作返回一行。
sys.database_event_session_events 在数据库范围的事件会话中为每个事件返回一行。
sys.database_event_session_fields 返回针对数据库范围的会话的事件和目标显式设置的每个可自定义列的行。
sys.database_event_session_targets 返回一行,表示数据库范围事件会话中的每个事件目标。
sys.database_event_sessions 为每个数据库范围的事件会话返回一行。

扩展事件动态管理视图

扩展事件提供若干动态管理视图 (DMV)。 DMV 返回有关 活动 (已启动)事件会话的信息,例如会话和目标统计信息。

DMV 的名称 说明
sys.dm_xe_database_session_event_actions 返回有关数据库范围事件会话操作的信息。
sys.dm_xe_database_session_events 返回有关数据库范围的事件会话事件的信息。
sys.dm_xe_database_session_object_columns 显示绑定到数据库范围会话的对象的配置值。
sys.dm_xe_database_session_targets 返回有关数据库范围内的事件会话目标的信息。
sys.dm_xe_database_sessions 返回当前数据库中运行的每个数据库范围的事件会话的行。

Permissions

在 Azure SQL 数据库、Fabric、Azure SQL 托管实例和 SQL Server 2022 及更高版本中,扩展事件支持精细的权限模型。 可授予以下权限:

CREATE ANY DATABASE EVENT SESSION
DROP ANY DATABASE EVENT SESSION
ALTER ANY DATABASE EVENT SESSION
ALTER ANY DATABASE EVENT SESSION ADD EVENT
ALTER ANY DATABASE EVENT SESSION DROP EVENT
ALTER ANY DATABASE EVENT SESSION ADD TARGET
ALTER ANY DATABASE EVENT SESSION DROP TARGET
ALTER ANY DATABASE EVENT SESSION ENABLE
ALTER ANY DATABASE EVENT SESSION DISABLE
ALTER ANY DATABASE EVENT SESSION OPTION

有关每个权限控件的信息,请查阅 CREATE EVENT SESSIONALTER EVENT SESSION、和 DROP EVENT SESSION

所有这些权限都包含在数据库、SQL 托管实例或 SQL Server 实例的权限中 CONTROL 。 在 Azure SQL 数据库中,数据库所有者 (dbo)、db_owner 数据库角色的成员和逻辑服务器管理员持有数据库 CONTROL 权限。 在 Azure SQL 托管实例和 SQL Server 中,服务器角色的成员 sysadmin 对实例拥有 CONTROL 权限。

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

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

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

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

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

注意

对于 Azure SQL 托管实例,建议使用服务器范围的事件会话。

数据库范围内的事件会话不会显示在 Azure SQL 托管实例的 SSMS 中的对象资源管理器中。 在 SQL 托管实例上,只能使用 Transact-SQL 查询和管理数据库范围内的事件会话。

为便于说明,下表列出并比较了目录视图的两个子集。 这些子集具有不同的名称前缀,因为它们支持不同的数据库引擎类型。

SQL Server 和 Azure SQL 托管实例中的名称 Azure SQL 数据库中的名称、Fabric 中的 SQL 数据库和 Azure SQL 托管实例中的名称
sys.server_event_session_actions
sys.server_event_session_events
sys.server_event_session_fields
sys.server_event_session_targets
sys.server_event_sessions
sys.database_event_session_actions
sys.database_event_session_events
sys.database_event_session_fields
sys.database_event_session_targets
sys.database_event_sessions