如果正确读取SQL Server中的扩展事件?

如果正确读取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/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119752.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mybatis-log plugiin激活码(JetBrains全家桶)

    (mybatis-log plugiin激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1STL…

    2022年3月27日
  • 【Linux】进程间通信「建议收藏」

    【Linux】进程间通信「建议收藏」目录1.进程间通信1.1.进程间通信的目的1.2.如何实现进程间通信2.管道通信2.1.匿名管道2.1.1创建匿名管道2.1.2.深入理解匿名管道2.2.命名管道2.2.1.创建命名管道3.systemV标准进程间通信3.1.共享内存3.1.1.实现原理3.1.2.代码实现3.2.消息队列(了解)3.2.1实现原理3.3.信号量(了解)3.3.1.实现原理1.进程间通信1.1.

    2022年10月11日
  • 数模(6):Leslie矩阵人口模型

    数模(6):Leslie矩阵人口模型上期中介绍了两种利用非线性函数拟合人口与物种增长趋势的方法。这两种方法都可以用于对人口与物种增长的总体趋势进行预测,但预测不够精细。我们知道在正常社会条件或自然条件下,生育率与死亡率是与群体的年龄构成息息相关的。我们需要对整个群体按年龄进行层次划分,构建与年龄相联系的人口模型。典型的例子就是Leslie矩阵模型。Leslie矩阵介绍我们把整个社会中的人群按年龄等距分成n组,每组中该年的人口总数…

    2022年5月14日
  • Modelsim的安装教程

    Modelsim的安装教程提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Modelsim安装二、激活成功教程1.拷贝Crack文件夹中的文件2.激活成功教程过程可能出现的错误前言Modelsim的安装与激活成功教程使用一、Modelsim安装打开下在之后的文件夹,直接双击exe文件进行安装。不熟悉时,可以直接使用默认路径进行安装,不进行路径上的修改。1、下载并解压好文件包,然后运行安装程序根据向导提示进行软件安装2、依提示安装软件过程中需要注意的是,会有三个弹出框提示,首先是是否创建桌面快捷方式提示

    2022年6月16日
  • 如何使用免费控件将Word表格中的数据导入到Excel中

    如何使用免费控件将Word表格中的数据导入到Excel中

    2021年9月11日
  • matlab的plot颜色_matlab plot线型和颜色

    matlab的plot颜色_matlab plot线型和颜色MATLABPlot如何自定义颜色Tip:Matlab作图时最好保存成fig格式,便于以后修改。写论文是一个漫长的过程,成文后最重要的一个问题就是如何让自己的论文排版和插图更加的好看,让枯燥的论文有一点生动的色彩。这里记录我在写论文时的困惑和一些小小的技巧。以下面这个图为例:X=linspace(0,5,51);Y1=sin(X);Y2=cos(0.5*X);Z=2*Y1+…

    2022年10月15日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号