扩展事件概述

适用于:SQL Server (所有受支持的版本) Azure SQL数据库Azure SQL 托管实例

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

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

尝试 XEvents:快速入门:SQL Server中的扩展事件

注意

Azure SQL 数据库仅支持数据库范围的会话。 了解代码示例Azure SQL数据库和SQL 托管实例以及有关 Azure SQL 数据库中扩展事件的详细信息的方式。

SQL Server 扩展事件的优点

扩展事件是使用最少性能资源的轻型性能监视系统。 SQL Server Management Studio 提供了一个图形用户界面,供扩展事件用于创建和修改会话以及显示和分析会话数据。 可以在此处了解有关这些扩展的详细信息:

扩展事件概念

SQL Server扩展事件基于现有概念(例如事件或事件使用者)构建,使用 Windows 事件跟踪的概念,并引入了新概念。

下表描述了扩展事件中的概念。

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

扩展事件体系结构

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

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

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

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

  • 扩展事件引擎是不识别事件的。 因此,该引擎可以将任何事件绑定到任何目标,因为该引擎不受事件内容约束。 有关扩展事件引擎的详细信息,请参阅 SQL Server Extended Events Engine

  • 事件与事件使用者不同,后者在扩展事件中称为“目标”。 也就是说任何目标可以接收任何事件。 此外,引发的任何事件均可供目标自动使用,这样可以记录或提供额外的事件上下文。 有关详细信息,请参阅 SQL Server Extended Events Targets

  • 事件不同于在事件发生时要执行的操作。 因此,任何操作可以与任何事件相关联。

  • 谓词可以在应捕获事件数据时动态进行筛选。 动态筛选增加了扩展事件基础结构的灵活性。 有关详细信息,请参阅 SQL Server Extended Events Packages

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

  • 一种跨服务器系统处理事件的统一方法,同时使用户可以隔离特定的事件进行故障排除。

  • 与现有的 ETW 工具集成并支持现有的 ETW 工具。

  • 基于 Transact-SQL 的完全可配置事件处理机制。

  • 可以动态监视活动进程,同时对这些进程的影响最小。

  • 运行时不会对性能造成任何明显影响的默认系统运行状况会话。 该会话收集的系统数据可用于帮助解决性能问题。 有关详细信息,请参阅 使用 system_health 会话

扩展事件任务

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

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

使用以下 Transact-SQL (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
      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 代码示例需要少量更改才能在云中运行。 此类代码示例的一个类别涉及其名称前缀在两个数据库系统之间略有不同的系统视图:

  • 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 中的名称 云服务中的名称
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 月。 但此处的表内容可能会过时,因为不会在此处保留它们。 有关准确的列表,请参阅以下 T-SQL SELECT 语句。

SELECT name
    FROM sys.all_objects
    WHERE
        (name LIKE 'database\_%' { ESCAPE '\' } OR
         name LIKE 'server\_%' { ESCAPE '\' })
        AND name LIKE '%\_event%' { ESCAPE '\' }
        AND type = 'V'
    ORDER BY name;

请参阅

后续步骤