使用查询编辑器创建扩展事件会话

可以使用查询编辑器创建扩展事件会话,也可以在对象资源管理器中创建会话。 在对象资源管理器中,扩展事件提供了两个用户界面,可用于创建、修改和查看事件会话数据 - 向导指导你完成事件会话创建过程,以及提供更高级的配置选项的新会话 UI。 可以创建扩展事件会话来诊断 SQL Server 跟踪,以便解决如下问题:

  • 查找最昂贵的查询

  • 查找闩锁争用的根本原因

  • 查找阻止其他查询的查询

  • 排查查询重新编译导致的过多 CPU 使用率问题

  • 排查死锁问题

有关如何使用“新建会话向导”创建扩展事件会话的信息,请参阅使用向导创建扩展事件会话(对象资源管理器)。 有关如何使用新会话 UI 创建扩展事件会话的信息,请参阅 使用“新建会话”对话框创建扩展事件会话

权限

若要创建扩展事件会话,必须具有 ALTER ANY EVENT SESSION 权限。

使用查询编辑器创建扩展事件会话

创建扩展事件会话

  1. 以下过程演示如何在 SQL Server Management Studio 中使用查询编辑器创建扩展事件会话。

    确定要在会话中使用的事件。 若要查看所有可用事件以及关键字和通道,请使用以下查询:

    注释

    有关关键字和通道的信息,请参阅 SQL Server 扩展事件包

    SELECT p.name, c.event, k.keyword, c.channel, c.description FROM  
       (  
       SELECT event_package = o.package_guid, o.description,   
       event=c.object_name, channel = v.map_value  
       FROM sys.dm_xe_objects o  
       LEFT JOIN sys.dm_xe_object_columns c ON o.name = c.object_name  
       INNER JOIN sys.dm_xe_map_values v ON c.type_name = v.name   
       AND c.column_value = cast(v.map_key AS nvarchar)  
       WHERE object_type = 'event' AND (c.name = 'CHANNEL' or c.name IS NULL)  
       ) c LEFT JOIN   
       (  
       SELECT event_package = c.object_package_guid, event = c.object_name,   
       keyword = v.map_value  
       FROM sys.dm_xe_object_columns c INNER JOIN sys.dm_xe_map_values v   
       ON c.type_name = v.name AND c.column_value = v.map_key   
       AND c.type_package_guid = v.object_package_guid  
       INNER JOIN sys.dm_xe_objects o ON o.name = c.object_name   
       AND o.package_guid = c.object_package_guid  
       WHERE object_type = 'event' AND c.name = 'KEYWORD'   
       ) k  
       ON  
       k.event_package = c.event_package AND (k.event=c.event or k.event IS NULL)  
       INNER JOIN sys.dm_xe_packages p ON p.guid = c.event_package  
    ORDER BY keyword desc, channel, event  
    
  2. 在新查询窗口中,添加以下语句以创建事件会话,并将 session_name 替换为要使用的会话名称:

    重要

    此过程的步骤 2 到 6 描述了事件会话定义的每个部分。 在执行之前,会将所有语句添加到单个查询窗口。 有关完整示例,请参阅本主题的“示例”部分。

    CREATE EVENT SESSION session_name   
    ON SERVER  
    
  3. package_name格式添加要监视的事件。event_name。 对于每个事件,请添加如下所示的行:

    ADD EVENT package_name.event_name  
    

    例如:

    ADD EVENT sqlserver.file_read_completed,  
    ADD EVENT sqlserver.file_write_completed  
    
  4. (可选)添加事件后,可以添加要执行的作。 还可以添加谓词。 谓词用于确定目标应何时使用事件信息的条件。 使用 ACTION 子句添加作,并使用 WHERE 子句添加谓词。 例如,若要为sqlserver.file_read_completed事件添加 Transact-SQL 文本捕获的作和谓词,其中文件 ID 等于 1,将包含以下语句:

    ADD EVENT sqlserver.file_read_completed  
       (ACTION (sqlserver.sql_text)  
       WHERE file_id = 1),  
    
    • 若要查看哪些作可用,请使用以下查询:

      SELECT p.name AS 'package_name', xo.name AS 'action_name', xo.description, xo.object_type  
      FROM sys.dm_xe_objects AS xo  
      JOIN sys.dm_xe_packages AS p  
         ON xo.package_guid = p.guid  
      WHERE xo.object_type = 'action'  
      AND (xo.capabilities & 1 = 0   
      OR xo.capabilities IS NULL)  
      ORDER BY p.name, xo.name  
      
    • 若要查看哪些谓词可用于事件,请使用以下查询,将 event_name 替换为要为其添加谓词的事件的名称:

      SELECT *  
      FROM sys.dm_xe_object_columns  
      WHERE object_name = 'event_name'  
      AND column_type = 'data'  
      

      例如:

      SELECT *   
      FROM sys.dm_xe_object_columns   
      WHERE object_name = 'file_read_completed'  
      AND column_type = 'data'  
      

      请注意,还可以添加全局谓词源。 全局谓词源可用于任何谓词表达式。 若要查看哪些全局谓词源可用,请使用以下查询:

      SELECT p.name AS package_name, xo.name AS predicate_name  
         , xo.description, xo.object_type  
      FROM sys.dm_xe_objects AS xo  
      JOIN sys.dm_xe_packages AS p  
         ON xo.package_guid = p.guid  
      WHERE xo.object_type = 'pred_source'  
      ORDER BY p.name, xo.name  
      

      例如,可以使用以下谓词表达式指定仅应为事件发生前五次的事件收集数据。

      WHERE package0.counter <= 5  
      
  5. 添加所需的目标,其中将处理和使用事件数据。 使用以下格式:

    ADD TARGET package_name.target_name  
    

    以下示例添加异步文件目标:

    ADD TARGET package0.asynchronous_file_target  
       (SET filename = 'c:\temp\xelog.xel', metadatafile = 'c:\temp\xelog.xem')  
    

    若要查看可用目标列表,请使用以下查询:

    SELECT p.name AS 'package_name', xo.name AS 'target_name'  
       , xo.description, xo.object_type   
    FROM sys.dm_xe_objects AS xo  
    JOIN sys.dm_xe_packages AS p  
       ON xo.package_guid = p.guid  
    WHERE xo.object_type = 'target'  
    AND (xo.capabilities & 1 = 0  
    OR xo.capabilities IS NULL)  
    ORDER BY p.name, xo.name  
    

    注释

    有关不同目标类型的信息,请参阅 SQL Server 扩展事件目标

  6. 查看并添加任何其他配置选项。 例如,可以配置诸如事件保留模式、事件在内存中缓冲的时间或事件会话在 SQL Server 启动时是否应自动启动的选项。 这些选项在主题 ALTER EVENT SESSION (Transact-SQL) 中有所介绍。 请注意,如果未指定这些选项,则分配默认值。

  7. 启动会话。

    注释

    有关如何查看会话结果的详细信息,请参阅联机丛书中 SQL Server 扩展事件目标 节点所使用目标类型的相关主题。

以下示例创建名为 IOActivity 的扩展事件会话,该会话捕获以下信息:

  • 已完成文件读取的事件数据,包括文件 ID 等于 1 的文件读取的关联 Transact-SQL 文本。

  • 已完成的文件写入的事件数据。

  • 将数据从日志缓存写入物理日志文件时的事件数据。

会话将输出发送到文件目标。

CREATE EVENT SESSION IOActivity  
ON SERVER  
  
ADD EVENT sqlserver.file_read_completed  
   (  
   ACTION (sqlserver.sql_text)  
   WHERE file_id = 1),  
ADD EVENT sqlserver.file_write_completed,  
ADD EVENT sqlserver.databases_log_flush  
  
ADD TARGET package0.asynchronous_file_target   
   (SET filename = 'c:\temp\xelog.xel', metadatafile = 'c:\temp\xelog.xem')  

另请参阅

CREATE EVENT SESSION (Transact-SQL)
SQL Server 扩展事件目标
SQL Server 扩展事件包