SQL 扩展事件

在本篇,我通过使用新建“Session ”对话框来创建新的扩展事件会话。定义一个自己的扩展事件,动作和谓词,并且发布一个以收集事件数据为目的的会话。

首先从UI开始

在SQLServer2008R2以后(不包括2008R2),才引入扩展事件的内置UI。2008的版本可以通过安装插件的形式或者使用T-sql语句来实现扩展事件。如果是2012以后的SSMS客户端,也可以访问2008 的数据库实例,但是看不到扩展事件UI。在2008版本中缺少UI,意味着必须写T-SQL和XQuery来挖掘事件数据。2012以后提供了UI来读取2008版本中的目标文件,同时也能使用UI来进行事件数据分析。

一下的实例都是以SQLServer 2012版进行,为了使用SSMS中的扩展事件,首先在对象浏览器中打开Management | Extended Events,在打开Sessions ,看到当前实例的会话时间的列表。打开后你能看到内置的两个扩展事件,AlwaysOn_health and system_health

图1

需要注意,扩展时间的优点之一就是事件会话保存于服务器的元数据中,因此默认重启后保存在实例中,然而追踪定义则不是,在重启后必须要执行一个自定义的存储过程来重新创建追踪。扩展事件很好的解决了这些繁琐的配置。

首先,当我们建好扩展事件以后可以选择会话—>编写会话脚本—>Create 到—>新建查询编辑窗口,得到扩展时间的创建语句。这个语句是与以前我们自己编写的脚本略有不同的。

其次,SQLServer 包含一个with脚本结尾的一些会话级别的选项。这些选项都是默认的。

CREATE EVENT SESSION [XE_ReadsFilter_Trace] ON SERVER
ADD EVENT sqlserver.rpc_completed (
    ACTION ( sqlserver.client_app_name
    , sqlserver.database_id
    , sqlserver.server_instance_name
    , sqlserver.session_id
   )
    WHERE
   ( logical_reads >= 10000 ) ),
ADD EVENT sqlserver.sql_statement_completed (
    ACTION ( sqlserver.client_app_name
    , sqlserver.database_id
    , sqlserver.server_instance_name
    , sqlserver.session_id
   )
    WHERE
   ( logical_reads >= 10000 ) )
ADD TARGET package0.event_file (  SET filename = ‘C:\temp\XE_ReadsFilter_Trace.xel‘ ,
                                  max_file_size = ( 5 ) ,
                                  max_rollover_files = ( 1 ) )
WITH (  MAX_MEMORY = 4096 KB ,
        EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS ,
        MAX_DISPATCH_LATENCY = 30 SECONDS ,
        MAX_EVENT_SIZE = 0 KB ,
        MEMORY_PARTITION_MODE = NONE ,
        TRACK_CAUSALITY = OFF ,
        STARTUP_STATE = OFF )
GO

  

代码1

我们使用UI创建一个新的事件会话,行为和属性,在过程的结束,又将构建这个扩展事件的语句输出了出来。

在UI创建一个新的事件会话

既可以使用新建会话向导或者新建会话。但是,向导可选项比较少,因此不推荐使用。所以我们重点介绍新建会话。

创建新的扩展事件,只需要邮件会话的文件夹,然后选择新建会话…对话框有四个属性页:常规,事件,数据存储和高级。

常规页

在常规页,我们可以输入事件名称,并且开启一些选项。这里我输入 HighReadQueries 作为名称,要求名称必须唯一 。

图2.常规页

事件页

下一步就是加一些事件,切换到事件页,选择我们选择我们打算追踪的事件并且配置他们。设定合适的操作和谓词。

添加事件

为了创建一个事件会话,一定要至少有一个事件。下面例子中,加入了两个事件,sqlserver.sql_statement_completedsqlserver.rpc_completed。这里可以搜索到所有的事件库,很多我们已经忘记的。在这个分析器中总共有180个时间供你选择,找到需要的。下面再事件库下面的输入框中输入completed ,下面的对话框自动将包含这个单词的事件筛选出来少于15个的事件。

图3

注意类别/通道这两个事件的列,基于关键字和通道的分类系统,被windows事件追踪所使用。这里不深入讲解了,理解就行。

双击要选中的两个事件,然后它们出现在右侧的列表中:然后点击配置按钮,添加动作和谓词。

图4

配置事件

事件配置选项由三个tab组成,全局字段,过滤和事件字段。

默认收集(事件字段)

事件字段标签展示事件所有列字段,构成事件的默认收集字段,有些开销较大的字段是可选收集与否的,如下图的data_stream…

图5

不同的事件有不同的默认捕捉事件数据。

添加操作

下面我们可以在全局字段tab中为两个事件添加需要的操作。操作也被称为全局字段,因为这些字段不特指任何独立事件,是公用的。

为了加上操作,只需要选中选择框。也可以把一个操作加到多个事件上,高亮两个事件,然后选中操作即可。这里我们把client_app_name, database_id, server_instance_name, 和session_id 加到这两个事件上。

图6

上述操作是普遍良性的。而扩展事件也提供额一下副作用的操作。例如debug_break字段就会引起调试中断。

设定过滤

最后,选择过滤tab来配置任意谓词。为了缩短事件估计,阻止扩展事件引擎收集没必要的数据,需要配置一个谓词来过滤事件数据。谓词配置和缩短逻辑是极其重要的。

例如,选中两个事件,然后从下拉列表选择logical_reads(逻辑读),改变操作符列为>=,然后输入10000。在这种配置下,我们的会话仅仅捕捉sqlstatement 或者存储过程执行超过时10000的逻辑读的事件。

图7

这种选择多个功能,加入相同的谓词给两个事件,限制了可利用的全局字段和俩个事件的普通字段。根据时间的选择,不是所有的字段都可以使用。例如,加入我们加入error_reported event事件,那么选择这三个事件时,逻辑读这个谓词就不能使用了。如下图

图8

在这个例子中,我们配置相同的谓词给两个事件,但是我们也可以灵活的配置每一个事件。

此刻,我们可以选择OK来创建事件会话完成会话,因为满足了最低要求。定义事件会话的目标是非必要的。例如,我们配置error_reported 事件加入create_dump_single_thread操作,没必要保存抓取数据。下面我们将介绍如何定义目标文件。

数据存储页:定义目标文件

选择数据存储也然后目标下面选择类型,选择event_file。接着下面输入文件名,选择浏览输入文件的输出位置。路径的最大长度是260个字符。例子中使用的是D:\temp\HighReadQueries。这里不需要包含文件的默认扩展名.xel。扩展事件引擎会附_0_和一个整性数字(文件创建时间到1600年1月1日的秒的数字)来作为文件结尾,保证文件名是唯一的。该文件类型提供了选项来设置最大文件的值,并且允许多次反复使用文件。如果没有指定文件最大值,则文件将会增长至填满驱动为止。

图9

高级会话选项

在高级选项页面,能看到额外的高级的会话选项。这里我们可以今后讨论,这里保持默认即可。

事件会话DDL

选择OK来完成会话,然后这个会话出现在扩展事件->会话的文件夹下,然后发现他是激活的,因为我们在一开始我们选择了可选框—创建会话后立即开启事件会话。生成T-SQL脚本,选择脚本按钮点击OK或者创建完成后右键输出创建脚本到查询窗口(之前介绍了)。这里我加上了相应的注释,以便理解。

/*Create the session, named as specified on the General page*/
CREATE EVENT SESSION [HighReadQueries] ON SERVER

/*Add and configure events, actions and predicates, as specified on the Events page*/
ADD EVENT sqlserver.rpc_completed (
    ACTION ( sqlserver.client_app_name,
      sqlserver.database_id,
      sqlserver.server_instance_name,
      sqlserver.session_id )
    WHERE ( [logical_reads] >= ( 10000 ) ) ),
ADD EVENT sqlserver.sql_statement_completed (
    ACTION ( sqlserver.client_app_name,
      sqlserver.database_id,
      sqlserver.server_instance_name,
      sqlserver.session_id )
    WHERE ( [logical_reads] >= ( 10000 ) ) )

/*Add and configure a target, as specified on the Data Storage page*/
ADD TARGET package0.event_file ( SET filename = N‘C:\temp\HighReadQueries‘ )

/* Set Session-level options, specified on the General and Advanced pages*/
WITH ( MAX_MEMORY = 4096 KB ,
        EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS ,
        MAX_DISPATCH_LATENCY = 30 SECONDS ,
        MAX_EVENT_SIZE = 0 KB ,
        MEMORY_PARTITION_MODE = NONE ,
        TRACK_CAUSALITY = OFF ,
        STARTUP_STATE = ON );
GO

  

代码2

与我们之前的代码很像。除了有会话立即开始,我们还选择了”捕获实时在屏幕上监视数据“。一个新的窗口被打开来显示被事件会话捕捉的数据,就像Profiler做的一样。但是不同的时,当观察实时数据引起系统性能问题时,监视器将会自动关闭。

总结

完成后,我们已经熟悉了扩展事件,比如创建基本会话,捕捉一个或者多个事件信息,收集操作的数量,使用简单的谓词,写入文件等等。可视化操作大大减轻了脚本的难度,也提供了很多基础信息的选择,大大方便了扩展事件的开发。这块只是开始应用,希望有大神能指点一下。

时间: 2024-10-13 11:24:50

SQL 扩展事件的相关文章

SQL Server扩展事件(Extended Events)-- 使用扩展事件跟踪监控死锁

SQL Server扩展事件(Extended Events)-- 使用扩展事件跟踪监控死锁 我们通过SQL Server 2012图形界面来部署一个扩展事件跟踪会话.然后可以生成SQL脚本,在2008或2008 R2版本下运行类似的跟踪. 步骤1: 通过"Object Explorer"连接到实例,展开"Management"."Extended Events"."Sessions". 步骤2: 右键点击"Sess

SQL Server扩展事件(Extended Events)-- 使用扩展事件跟踪查询语句

SQL Server扩展事件(Extended Events)-- 使用扩展事件跟踪查询语句 创建扩展事件会话 展开"Object Explorer"."Management"."Extended Events"."Sessions"目录,你会发现一到两个预设的会话.默认,在SQL Server 2012包含system_health会话,而根据不同的SQL Server2012的版本,可能有AlwaysOn_health会话

SQL Server扩展事件(Extended Events)-- 扩展事件概念解析

SQL Server扩展事件(Extended Events)-- 扩展事件概念解析 下图描述了扩展事件中引入的几个新概念: 事件 事件是指代码中定义的点.此类示例包括:T-SQL 语句完成执行时的点或结束获取锁定时的点.每个事件都有一个定义的负载(该事件返回的列的集合),它是使用 ETW 模型(其中每个事件都返回一个通道和关键字作为负载的一部分)来定义的,以便能够与 ETW 集成.SQL Server 2008 最初提供 254 个定义的事件,预计在今后还会增加. 使用下列代码可以查看这些定义

SQL Server扩展事件(Extended Events)-- 性能注意事项

SQL Server扩展事件(Extended Events)-- 性能注意事项 使用 CREATE EVENT SESSION 将扩展事件会话放置在一起时,需要认真正确配置一些设置,因为它们可能会在无意中对性能产生影响.首先需要决定是以同步还是异步方式消耗事件.正如您所料,同步目标对所监控代码的性能产生的影响要大过异步目标. 如前所述,同步消耗某个事件时,触发该事件的代码必须一直等待,直到该事件被消耗为止.显然,如果事件消耗是一个复杂的过程,则这可能会降低代码的性能. 例如,在一个每秒处理数千

SQL Server 扩展事件(Extented Events)从入门到进阶(4)——扩展事件引擎——基本概念

本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列 在第一二节中,我们创建了一些简单的.类似典型SQL Trace的扩展事件会话.在此过程中,介绍了很多扩展事件基础组件,包括事件.谓词.操作和目标.本节,将对扩展事件引擎.架构和基本组件做更加深入的了解.通过这些讲解,可以大概了解到为什么扩展事件相对于SQL Trace来说更加低开销.另外,还会延时如何设计事件会话从而最小化事件收集过程中的不必要开销,即使这些事件会话会很复杂. 事件数据收集生命周期: 扩

SQL Server扩展事件(Extended Events)-- 事件的寿命

SQL Server扩展事件(Extended Events)-- 事件的寿命 定义并启动扩展事件会话后,处理过程将照常进行,直到所监控的代码遇到某个事件为止.下图介绍了扩展事件系统所遵循的步骤. 具体步骤如下: 1. 执行检查以查看是否有任何扩展事件会话正在监控该事件.如果没有,控制权将返给包含该事件的代码,然后继续进行处理. 2. 确定事件的负载,将所需的全部信息都收集到内存中 - 换言之,构建事件的负载. 3. 如果为该事件定义了任何谓词,则执行它们.此时,谓词结果可能是不应消耗该事件.如

SQL Server扩展事件(Extended Events)—使用system_health扩展事件会话

SQL Server扩展事件(Extended Events)-使用system_health扩展事件会话 system_health 会话是 SQL Server 默认包含的扩展事件会话. 该会话在 SQL Server 数据库引擎启动时自动启动,并且运行时不会对性能造成任何明显影响. 该会话收集的系统数据可用于帮助对数据库引擎的性能问题进行故障排除. 因此,我们建议您不要停止或删除该会话. 此会话源自产品支持团队的想法,它可以跟踪通常被用来对客户系统进行调试的信息(例如当客户系统发生死锁或出

SQL Server扩展事件(Extended Events)-- 使用system_health默认跟踪会话监控死锁

SQL Server扩展事件(Extended Events)-- 使用system_health默认跟踪会话监控死锁 自SQL Server 2008以后,提供了扩展事件(Extended Events)来跟踪系统分析定位问题.默认的system_health会话一直在运行,可以帮助你更快的定位问题. 运行如下脚本可以看到system_health扩展事件会话: SELECT * FROM sys.dm_xe_sessions 即便是你没有启动任何扩展事件会话,这个查询也会返回一行system

SQL Server扩展事件(Extended Events)-- 体系结构

SQL Server扩展事件(Extended Events)-- 体系结构 MSDN:http://msdn.microsoft.com/zh-cn/library/bb630282%28v=sql.110%29.aspx BLOG:http://blogs.msdn.com/b/extended_events/ SQL Server 扩展事件具有高度可伸缩且高度可配置的体系结构,使用户能够按需收集解决性能问题或确定性能问题所需的信息.扩展事件是使用非常少的性能资源的轻型性能监视系统. 扩展事