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

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

  1. 1: WITH events_cte

  1. 2: AS ( SELECT DATEADD(mi,

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

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

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

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

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

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

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

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

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

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

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

  1. 14:

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

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

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

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

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

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

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

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

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

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

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

  1. 26: NULL, NULL, NULL)

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

  1. 28: ) AS xevents

  1. 29: )

  1. 30: SELECT *

  1. 31: FROM events_cte

  1. 32: ORDER BY [event time] DESC;

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

 

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

  1. 1: WITH tt

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

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

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

  1. 5: AND d_package IS NOT NULL THEN d_value

  1. 6: END))) AS [event_timestamp] ,

  1. 7: CONVERT

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

  1. 9: AND d_package IS NOT NULL THEN d_value

  1. 10: END)) AS [Client_hostname] ,

  1. 11: CONVERT

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

  1. 13: d_name = 'client_app_name'

  1. 14: THEN d_value

  1. 15: END)) AS [Client_app_name] ,

  1. 16: CONVERT

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

  1. 18: AND d_package IS NOT NULL THEN d_value

  1. 19: END)) AS [database_name] ,

  1. 20: CONVERT

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

  1. 22: THEN d_value

  1. 23: END)) AS [object_name] ,

  1. 24: CONVERT

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

  1. 26: AND d_name = 'duration'

  1. 27: AND d_package IS NULL THEN d_value

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

  1. 29:

  1. 30: CONVERT

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

  1. 32: THEN d_value

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

  1. 34: CONVERT

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

  1. 36: AND d_package IS NOT NULL THEN d_value

  1. 37: END)) AS [username]

  1. 38: FROM ( SELECT * ,

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

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

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

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

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

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

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

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

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

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

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

  1. 50: 'VARCHAR(MAX)') AS d_text

  1. 51: FROM ( SELECT ( SELECT

  1. 52: CONVERT(XML, target_data)

  1. 53: FROM

  1. 54: sys.dm_xe_session_targets st

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

  1. 56: WHERE

  1. 57: s.name = 'DDL'

  1. 58: AND st.target_name = 'ring_buffer'

  1. 59: ) AS [x]

  1. 60: FOR

  1. 61: XML PATH('') ,

  1. 62: TYPE

  1. 63: ) AS the_xml ( x )

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

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

  1. 66: AS q ( n )

  1. 67: ) AS data_data

  1. 68: ) AS activity_data

  1. 69: GROUP BY unique_event_id

  1. 70: )

  1. 71: SELECT *

  1. 72: FROM tt

  1. 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. [LeetCode]436 Find Right Interval

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  2. 02、AngularJs的数据绑定

    我们知道,AngularJs中的数据绑定是双向绑定的,View的改变,会改变Model,Model的改变也会改变View中的值,废话不多说,我们直接上代码. <!DOCTYPE html> ...

  3. Enable MFA for a user

    If you are root/admin account, in order to configure a virtual MFA device, you must have physical ac ...

  4. for循环三个表达式的执行时间

    for(int i = 0; i < max; i++) { //代码 } 第一个表达式:声明一个变量i,初始值为0,表示当前的循环次数:循环刚开始时执行第二个表达式:循环条件,如果i的值小于m ...

  5. (原创)巩固理解基于DS18B20的1-wire协议(MCU,经验)

    1.Abstract     如前篇随笔所写,将以前遇到最难懂的两个部分重拾一下.前一篇写的是I2C协议(http://www.cnblogs.com/hechengfei/p/4117840.htm ...

  6. minigui编译

    1, libminigui修改单 file: src/kernel/desktop.c func: def_mouse_handler keywords: MSG_DT_RBUTTONUP break ...

  7. 怎样让.bat文件开机自启动

    Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\R ...

  8. 桌面 透明 三角形 分层窗口 DX

    //桌面 透明 三角形 分层窗口 DX //IDirect3DSurface9 GetDC UpdateLayeredWindow #include <Windows.h> #includ ...

  9. 【Win10 UWP】URI Scheme(一):Windows Store协议的解析和使用

    协议是Windows Phone和Windows Store应用的一个重要特点,可以做到在不同应用之间进行互相呼起调用.小小协议,学问大着呢.我打算写几篇关于协议在UWP中使用的文章. 这一讲的主要对 ...

  10. ABP框架Web API跨域问题的解决方案

    ​1.在Web Api 项目下安装 Microsoft.AspNet.WebApi.Cors 包 Install-Package Microsoft.AspNet.WebApi.Cors 2.在Web ...