如果正确读取SQL Server中的扩展事件?
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中的扩展事件?的更多相关文章
- SQL Server中的扩展事件学习系列
SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events SQL Server 扩展事件(Extented Event ...
- SQL SERVER中的扩展属性
以前在SQL SERVER建表时,总看到扩展属性,但一直未使用过.今天研究下: 增加扩展属性: 语法: sp_addextendedproperty [ @name = ] { 'property_n ...
- 怎么捕获和记录SQL Server中发生的死锁
我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方式有一个很大的敝端,就是消耗很大.据国外某大神测试,profiler甚至可以占到服 务器总带宽的35%,所以,在 ...
- 捕获和记录SQL Server中发生的死锁
经带在论坛上看到有人在问怎么捕获和记录死锁信息,在这里,我将自己的一些心得贡献出来,与大家分享,也请各位指正. 我们知道,可以使用SQL Server自带的Profiler工具来跟踪死锁信息.但这种方 ...
- (4.7)怎么捕获和记录SQL Server中发生的死锁?
转自:https://blog.csdn.net/c_enhui/article/details/19498327 怎么捕获和记录SQL Server中发生的死锁? 关键词:死锁记录,死锁捕获 sql ...
- SQLServer中使用扩展事件获取Session级别的等待信息以及SQLServer 2016中Session级别等待信息的增强
本文出处:http://www.cnblogs.com/wy123/p/6835939.html 什么是等待 简单说明一下什么是等待:当应用程序对SQL Server发起一个Session请求的时候, ...
- 此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行
错误提示:此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行.若要将此服务器连接到服务器场,请使用 SharePoint 产品配置向导,该向导可从 ...
- 如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录。
如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录. 主要用到DATEADD函数,下面是详细语句 取最近3天 select * from 表名where rq> ...
- [转] C#实现在Sql Server中存储和读取Word文件 (Not Correct Modified)
出处 C#实现在Sql Server中存储和读取Word文件 要实现在Sql Server中实现将文件读写Word文件,需要在要存取的表中添加Image类型的列,示例表结构为: CREATE TABL ...
随机推荐
- WPF 图片显示中的保留字符问题
在WPF中显示一张图片,本是一件再简单不过的事情.一张图片,一行XAML代码即可. 但是前段时间遇到了一件奇怪的事: 开发机上运行正常的程序,在某些客户机器上却显示不了图片,而且除了这个问题,其它运行 ...
- Windows 8.1 应用开发文章汇总
Windows 8.1 应用再出发 - C# + XAML 1. Windows 8.1 应用再出发 - 创建我的第一个应用 2. Windows 8.1 应用再出发 - 几种常用控件 3. Win ...
- hdu 1166 敌兵布阵(树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始 ...
- sqlserver 2008 数据库表结构脚本及数据导出
sqlserver2008 在xp上尝试安装了 sqlserver2008 express版本,但是和公司的sqlserver2008 r2 版本不兼容.升级的时候,出了问题.所以换了中思路,将数据 ...
- 在C#中简单调用FindWindow控制其他程序
C#本身是没有FindWindow这个函数的, 为什么没有呢? 很简单,C#毕竟是微软自家开发出来的.而WIN API中本来封装了很多对窗口的操作,所以当然能重用的就要重用,这些封装好的函数一般在系统 ...
- iOS网络基础知识
iOS网络基础知识 1.一次HTTP请求的完整过程 (1)浏览器或应用发起Http请求,请求包含Http请求Http(请求),地址(url),协议(Http1.1)请求为头部 (2)web服务器接收到 ...
- Linux内核--网络栈实现分析(三)--驱动程序层+链路层(上)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7497260 更多请看专栏,地址 ...
- 一个事务复制的bug--更新丢失 续
阅读本文之前请参考http://www.cnblogs.com/stswordman/p/3258897.html 最近又做了一个case,环境是sql server 2008 R2. 客户添加了一个 ...
- 《Learninghard C#学习笔记》回馈网友,免费送书5本
前言: 在博客园园友的大力支持下,本人的第一本书<Learninghard C#学习笔记>终于出版了. 这本书是本人学习C#的亲身经历,书籍内容都是本人学习过程中认为必须掌握的内容,完全无 ...
- 即时通信系统中如何实现:聊天消息加密,让通信更安全? 【低调赠送:QQ高仿版GG 4.5 最新源码】
加密重要的通信消息,是一个常见的需求.在一些政府部门的即时通信软件中(如税务系统),对聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新的GG 4.5中,增加了对聊天消息 ...