SQL Server中使用扩展事件捕捉所需的信息后,可以选择存放的位置。比如说内存或文件中,但无论存在哪里,其本质都是一个大XML。因此在SQL Server中读取该XML就是解析扩展事件结果的方式。

    微软官方或者一些SQL Server论坛提供了使用SQL XML解析扩展事件的脚本,如代码清单1所示。

   1: WITH    events_cte

   2:           AS ( SELECT   DATEADD(mi,

   3:                                 DATEDIFF(mi, GETUTCDATE(), CURRENT_TIMESTAMP),

   4:                                 xevents.event_data.value('(event/@timestamp)[1]',

   5:                                                          'datetime2')) AS [event time] ,

   6:                                                             xevents.event_data.value('(event/@name)[1]',

   7:                                                  'nvarchar(128)') AS [Event Name],

   8:                         xevents.event_data.value('(event/action[@name="client_app_name"]/value)[1]',

   9:                                                  'nvarchar(128)') AS [client app name] ,

  10:                         xevents.event_data.value('(event/action[@name="client_hostname"]/value)[1]',

  11:                                                  'nvarchar(max)') AS [client host name] ,

  12:                         xevents.event_data.value('(event/action[@name="sql_text"]/value)[1]',

  13:                                                  'nvarchar(max)') AS [sql_text] ,

  14:           

  15:                         xevents.event_data.value('(event/action[@name="database_name"]/value)[1]',

  16:                                                  'nvarchar(max)') AS [database name] ,

  17:                         xevents.event_data.value('(event/action[@name="username"]/value)[1]',

  18:                                                  'nvarchar(max)') AS [username] ,

  19:                         xevents.event_data.value('(event/action[@name="duration"]/value)[1]',

  20:                                                  'bigint') AS [duration (ms)] ,

  21:                         xevents.event_data.value('(event/action[@name="cpu_time"]/value)[1]',

  22:                                                  'bigint') AS [cpu time (ms)] ,

  23:                         xevents.event_data.value('(event/data[@name="object_name"]/value)[1]',

  24:                                                  'nvarchar(max)') AS [OBJECT_NAME]

  25:                FROM     sys.fn_xe_file_target_read_file('D:\XeventResutl\DDLAudit*.xel',

  26:                                                         NULL, NULL, NULL)

  27:                         CROSS APPLY ( SELECT    CAST(event_data AS XML) AS event_data

  28:                                     ) AS xevents

  29:              )

  30:     SELECT  *

  31:     FROM    events_cte

  32:     ORDER BY [event time] DESC;

代码清单1.读取扩展事件文件的脚本

 

    但代码清单1的脚本使用的是XQuery,XQuery在使用Xml的节点属性作为删选条件时,数据上千以后就会变得非常慢。因此我对上述脚本进行了改写,将XML读取出来后,变为节点的集合以关系数据格式存放,再用子查询进行筛选,这种方式读取数据基本上是秒出,如代码清单2所示。

   1: WITH   tt

   2:          AS ( SELECT   MIN(event_name) AS event_name ,

   3:               DATEADD(hh,DATEDIFF(hh, GETUTCDATE(), CURRENT_TIMESTAMP),

   4:                                CONVERT(DATETIME, MIN(CASE WHEN d_name = 'collect_system_time'

   5:                                                          AND d_package IS NOT NULL THEN d_value

   6:                                                      END))) AS [event_timestamp] ,

   7:                        CONVERT 

   8:        (VARCHAR(MAX), MIN(CASE WHEN  d_name = 'client_hostname'

   9:                                     AND d_package IS NOT NULL THEN d_value

  10:                           END)) AS [Client_hostname] ,

  11:                        CONVERT 

  12:        (VARCHAR(MAX), MIN(CASE WHEN --event_name = 'sql_batch_completed'

  13:                                d_name = 'client_app_name'

  14:                               THEN d_value

  15:                     END)) AS [Client_app_name] ,

  16:                        CONVERT 

  17:        (VARCHAR(MAX), MIN(CASE WHEN  d_name = 'database_name'

  18:                                     AND d_package IS NOT NULL THEN d_value

  19:                           END)) AS [database_name] ,

  20:                           CONVERT

  21:                                   (VARCHAR(MAX), MIN(CASE WHEN  d_name = 'object_name'

  22:                                      THEN d_value

  23:                           END)) AS [object_name] ,

  24:                        CONVERT 

  25:        (BIGINT, MIN(CASE WHEN event_name = 'sql_batch_completed'

  26:                               AND d_name = 'duration'

  27:                               AND d_package IS NULL THEN d_value

  28:                     END)) AS [sql_statement_completed.duration] ,

  29:             

  30:                        CONVERT 

  31:        (VARCHAR(MAX), MIN(CASE WHEN d_name = 'sql_text'

  32:                                      THEN d_value

  33:                           END)) AS [sql_statement_completed.sql_text] ,

  34:                        CONVERT 

  35:        (VARCHAR(MAX), MIN(CASE WHEN d_name = 'username'

  36:                                     AND d_package IS NOT NULL THEN d_value

  37:                           END)) AS [username] 

  38:               FROM     ( SELECT    * ,

  39:                                    CONVERT(VARCHAR(400), NULL) AS attach_activity_id

  40:                          FROM      ( SELECT    event.value('(@name)[1]',

  41:                                                            'VARCHAR(400)') AS event_name ,

  42:                                                DENSE_RANK() OVER ( ORDER BY event ) AS unique_event_id ,

  43:                                                n.value('(@name)[1]',

  44:                                                        'VARCHAR(400)') AS d_name ,

  45:                                                n.value('(@package)[1]',

  46:                                                        'VARCHAR(400)') AS d_package ,

  47:                                                n.value('((value)[1]/text())[1]',

  48:                                                        'VARCHAR(MAX)') AS d_value ,

  49:                                                n.value('((text)[1]/text())[1]',

  50:                                                        'VARCHAR(MAX)') AS d_text

  51:                                      FROM      ( SELECT    ( SELECT

  52:                                                              CONVERT(XML, target_data)

  53:                                                              FROM

  54:                                                              sys.dm_xe_session_targets st

  55:                                                              JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address

  56:                                                              WHERE

  57:                                                              s.name = 'DDL'

  58:                                                              AND st.target_name = 'ring_buffer'

  59:                                                            ) AS [x]

  60:                                                FOR

  61:                                                  XML PATH('') ,

  62:                                                      TYPE

  63:                                                ) AS the_xml ( x )

  64:                                                CROSS APPLY x.nodes('//event') e ( event )

  65:                                                CROSS APPLY event.nodes('*')

  66:                                                AS q ( n )

  67:                                    ) AS data_data

  68:                        ) AS activity_data

  69:               GROUP BY unique_event_id

  70:             )

  71:    SELECT  *

  72:    FROM    tt

  73:  

代码清单2.对扩展事件结果的优化读取方式

 

参考资料:http://blog.wharton.com.au/2011/06/13/part-5-openxml-and-xquery-optimisation-tips/

如果正确读取SQL Server中的扩展事件?的更多相关文章

  1. SQL Server中的扩展事件学习系列

    SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events SQL Server 扩展事件(Extented Event ...

  2. SQL SERVER中的扩展属性

    以前在SQL SERVER建表时,总看到扩展属性,但一直未使用过.今天研究下: 增加扩展属性: 语法: sp_addextendedproperty [ @name = ] { 'property_n ...

  3. 怎么捕获和记录SQL Server中发生的死锁

    我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方式有一个很大的敝端,就是消耗很大.据国外某大神测试,profiler甚至可以占到服 务器总带宽的35%,所以,在 ...

  4. 捕获和记录SQL Server中发生的死锁

    经带在论坛上看到有人在问怎么捕获和记录死锁信息,在这里,我将自己的一些心得贡献出来,与大家分享,也请各位指正. 我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方 ...

  5. (4.7)怎么捕获和记录SQL Server中发生的死锁?

    转自:https://blog.csdn.net/c_enhui/article/details/19498327 怎么捕获和记录SQL Server中发生的死锁? 关键词:死锁记录,死锁捕获 sql ...

  6. SQLServer中使用扩展事件获取Session级别的等待信息以及SQLServer 2016中Session级别等待信息的增强

    本文出处:http://www.cnblogs.com/wy123/p/6835939.html 什么是等待 简单说明一下什么是等待:当应用程序对SQL Server发起一个Session请求的时候, ...

  7. 此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行

    错误提示:此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行.若要将此服务器连接到服务器场,请使用 SharePoint 产品配置向导,该向导可从 ...

  8. 如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录。

    如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录. 主要用到DATEADD函数,下面是详细语句 取最近3天 select * from 表名where rq> ...

  9. [转] C#实现在Sql Server中存储和读取Word文件 (Not Correct Modified)

    出处 C#实现在Sql Server中存储和读取Word文件 要实现在Sql Server中实现将文件读写Word文件,需要在要存取的表中添加Image类型的列,示例表结构为: CREATE TABL ...

随机推荐

  1. 数据库优化之锁表查询 (Sql Server)

    查询锁表语句 select request_session_id spid,DB_NAME(resource_database_id) databaseName, OBJECT_NAME(resour ...

  2. Android中NDK的搭建及简单使用 Android.mk相关介绍 JNI的使用

    Android中NDK的搭建及简单使用: 使用NDK,简述其重要步骤:.搭建NDK环境(作用:用于自动生成jni下的.c对应的so文件)---到Android NDK官网或Android官网下载ndk ...

  3. android 编译代码注意事项

    1 安装openjdk1.7 sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-apt update sudo apt-get install op ...

  4. node安装笔记

    安装node.js1.下载node可以直接下载二进制,也可以下载源代码再安装.我选择下载二进制: https://nodejs.org/dist/v4.6.0/node-v4.6.0-linux-x6 ...

  5. 如何为Eclipse安装主题(Color Theme)

    Eclipse开发环境默认都是白底黑字的,看到同事的Xcode中设置的黑灰色背景挺好看的,就去网上查了一下.发现Eclipse也可以设置主题. 方法1:你可以从Eclipse Marketplace中 ...

  6. \(\S1\) 描述性统计

    在认识客观世界的过程中,统计学的思想和方法经常起着不可替代的作用.在许多工程及自然科学的专业领域中,包括可靠性分析.质量控制.生物信息.脑科学.心理分析.经济分析.金融风险管理.社会科学推断.行为科学 ...

  7. 使用knockout-sortable实现对自定义菜单的拖拽排序

    在开始之前,照例,我们先看效果和功能实现. 关于自定义菜单的实现,这里就不多说了,需要了解的请访问:http://www.cnblogs.com/codelove/p/4838766.html 这里需 ...

  8. nginx(4、缓存)

    nginx提供内置的缓存功能,对静态文件,如html\css\js等能够缓存在本地,即nginx服务器的某个目录下. 其配置主要是两部分: 1.在http下配置一个缓存路径: proxy_cache_ ...

  9. UWP的一种下拉刷新实现

    简介 我们最近实现了一个在UWP中使用的下拉刷新功能,以满足用户的需求,因为这是下拉刷新是一种常见的操作方式,而UWP本身并不提供这一机制. 通过下拉刷新这一机制,可以让移动端的界面设计变得更加简单, ...

  10. Task:取消异步计算限制操作 & 捕获任务中的异常

    Why:ThreadPool没有内建机制标记当前线程在什么时候完成,也没有机制在操作完成时获得返回值,因而推出了Task,更精确的管理异步线程. How:通过构造方法的参数TaskCreationOp ...