SQL 扩展事件

 

    在本篇,我经过使用新建“Session ”对话框来建立新的扩展事件会话。定义一个本身的扩展事件,动做和谓词,而且发布一个以收集事件数据为目的的会话。sql

首先从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_healthwindows

   

image

图1浏览器

 

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

    首先,当咱们建好扩展事件之后能够选择会话—>编写会话脚本—>Create 到—>新建查询编辑窗口,获得扩展时间的建立语句。这个语句是与之前咱们本身编写的脚本略有不一样的。session

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

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

  

代码1sqlserver

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

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

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

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

image

常规页

    在常规页,咱们能够输入事件名称,而且开启一些选项。这里我输入 HighReadQueries 做为名称,要求名称必须惟一 。image

图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作的同样。可是不一样的时,当观察实时数据引发系统性能问题时,监视器将会自动关闭。

总结

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

相关文章
相关标签/搜索