利用扩展事件(Xevents)捕捉高消耗查询

生产环境中有时需要使用者抓取一些特定的语句分析,如超超长查询,或高IO查询等.一般来说大家对跟踪比较熟悉,主要因为其有完善的UI支持.由于扩展事件在sql2012才提供UI支持,所以虽然在08时就已经存在的更轻量级的扩展事件没有被广泛使用.这里和大家分享一个扩展事件脚本,用来捕捉高消耗的查询语句.

注意:使用完毕后应停止扩展事件捕捉.

应根据自身实际需求设置过滤条件,如CPU,duration,Reads等

在sql2012中会提供更为丰富的内容(如query_hash等)

code 1 将扩展事件追踪保存到本地文件中

CREATE EVENT SESSION L_QUERIES ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.username,sqlserver.client_hostname,sqlserver.database_id,sqlserver.session_id,sqlserver.sql_text,sqlserver.plan_handle)
    WHERE (cpu>1000 AND duration>=5000000 and Reads>=10000 and sqlserver.database_id=17))
ADD TARGET package0.asynchronous_file_target
   (SET FILENAME = N‘D:\L_QUERIES.xel‘, METADATAFILE = N‘D:\L_QUERIES.xem‘)
WITH (max_dispatch_latency = 1 seconds);
--cpu 1s
--duration 5s
--reads io 10000
--database_id 17 if you do not need it ,cut out
GO

ALTER EVENT SESSION L_QUERIES ON SERVER STATE = START;------start the event
GO 

SELECT
   data.value (
      ‘(/event[@name=‘‘sql_statement_completed‘‘]/@timestamp)[1]‘, ‘DATETIME‘) AS [Time],
   data.value (
      ‘(/event/data[@name=‘‘cpu‘‘]/value)[1]‘, ‘INT‘) AS [CPU (ms)],
   data.value (
      ‘(/event/data[@name=‘‘reads‘‘]/value)[1]‘, ‘BIGINT‘) AS [Reads],
   data.value (
      ‘(/event/action[@name=‘‘session_id‘‘]/value)[1]‘, ‘smallint‘) AS [session_id],
   data.value (
      ‘(/event/action[@name=‘‘database_id‘‘]/value)[1]‘, ‘smallint‘) AS [database_id],
   CONVERT (FLOAT, data.value (‘(/event/data[@name=‘‘duration‘‘]/value)[1]‘, ‘BIGINT‘)) / 1000000
      AS [Duration (s)],
   data.value (
        ‘(/event/action[@name=‘‘username‘‘]/value)[1]‘, ‘VARCHAR(100)‘) AS [username],
   data.value  (
        ‘(/event/action[@name=‘‘client_hostname‘‘]/value)[1]‘, ‘VARCHAR(100)‘) AS [client_hostname],
   data.value  (
        ‘(/event/action[@name=‘‘sql_text‘‘]/value)[1]‘, ‘VARCHAR(MAX)‘) AS [SQL Statement],
   SUBSTRING (data.value (‘(/event/action[@name=‘‘plan_handle‘‘]/value)[1]‘, ‘VARCHAR(100)‘), 15, 50)
      AS [Plan Handle]
FROM
   (SELECT CONVERT (XML, event_data) AS data FROM sys.fn_xe_file_target_read_file
      (‘D:\L_QUERIES*.xel‘, ‘D:\L_QUERIES*.xem‘, null, null)
) entries
ORDER BY [Time] DESC;----------query the event info what you need

--ALTER EVENT SESSION L_QUERIES ON SERVER STATE = STOP;---stop the event

--DROP EVENT SESSION L_QUERIES ON SERVER;------------drop the event

code2 将扩展事件保存到ring buffer中

CREATE EVENT SESSION L_QUERIES ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.username,sqlserver.client_hostname,sqlserver.database_id,sqlserver.session_id,sqlserver.sql_text,sqlserver.plan_handle)
    WHERE (cpu>1000 AND duration>=5000000 and Reads>=10000 and sqlserver.database_id=17))
    ADD TARGET package0.ring_buffer
        (SET max_memory = 4000) -----not the default 4096kb
   WITH (max_dispatch_latency = 1 seconds)
--cpu 1s
--duration 5s
--reads io 10000
--database_id 17 if you do not need it ,cut out
GO

ALTER EVENT SESSION L_QUERIES ON SERVER STATE = START;------start the event
GO 

DECLARE @target_data XML
SELECT  @target_data=CAST(target_data AS XML)
FROM sys.dm_xe_sessions AS s
JOIN sys.dm_xe_session_targets AS t
    ON t.event_session_address = s.address
WHERE s.name = ‘L_QUERIES‘
  AND t.target_name = ‘ring_buffer‘

SELECT
   t.value(‘(@timestamp)[1]‘, ‘datetime2‘) AS [time],
   t.value (‘(data[@name=‘‘cpu‘‘]/value)[1]‘, ‘INT‘) AS [CPU (ms)],
   t.value (‘(data[@name=‘‘reads‘‘]/value)[1]‘, ‘BIGINT‘) AS [Reads],
   t.value (‘(action[@name=‘‘session_id‘‘]/value)[1]‘, ‘smallint‘) AS [session_id],
   t.value (‘(action[@name=‘‘database_id‘‘]/value)[1]‘, ‘smallint‘) AS [database_id],
   CONVERT (FLOAT, t.value (‘(data[@name=‘‘duration‘‘]/value)[1]‘, ‘BIGINT‘)) / 1000000
      AS [Duration (s)],
   t.value (‘(action[@name=‘‘username‘‘]/value)[1]‘, ‘VARCHAR(100)‘) AS [username],
   t.value (‘(action[@name=‘‘client_hostname‘‘]/value)[1]‘, ‘VARCHAR(100)‘) AS [client_hostname],
   t.value (‘(action[@name=‘‘sql_text‘‘]/value)[1]‘, ‘VARCHAR(MAX)‘) AS [SQL Statement],
   SUBSTRING (t.value (‘(action[@name=‘‘plan_handle‘‘]/value)[1]‘, ‘VARCHAR(100)‘), 15, 50)
      AS [Plan Handle]
    FROM @target_data.nodes(‘RingBufferTarget/event‘) AS q(t)
ORDER BY [Time] DESC;----------query the event info what you need

--ALTER EVENT SESSION L_QUERIES ON SERVER STATE = STOP;---stop the event

--DROP EVENT SESSION L_QUERIES ON SERVER-----------drop the event
时间: 2024-11-01 15:44:53

利用扩展事件(Xevents)捕捉高消耗查询的相关文章

利用扩展事件进行调优和Troubleshooting PPT分享

    本篇主题是我在2015年中国数据库大会(DTCC)上的分享,扩展事件从2008版本出来到现在已经有6-7年,国内却很少有相关资料和使用,现在分享一下PPT,希望对大家有所帮助.       可以点击这里下载.

SQL Server扩展事件(Extended Events)-- 使用扩展事件跟踪查询语句

SQL Server扩展事件(Extended Events)-- 使用扩展事件跟踪查询语句 创建扩展事件会话 展开"Object Explorer"."Management"."Extended Events"."Sessions"目录,你会发现一到两个预设的会话.默认,在SQL Server 2012包含system_health会话,而根据不同的SQL Server2012的版本,可能有AlwaysOn_health会话

通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?

原文:通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了? 问题就是,一个很简单的语句,在不同的服务器上执行,所需要的时间相差很大,特别提到在性能差的服务器上反而快,在性能好的服务器上反而慢,他想知道这是为什么? 对这个问题,我的回答是: 从表面看,很难分析出为什么多台机器执行同一个简单的sql语句,速度有差异,甚至好的服务器反而花了更多的时间,而看上去相对较差的机器反而更快,这些都是表面现象. 我们可以分析一下整个SQL语句执行的大致过程: 1.语句发送到SQL S

SQL Server扩展事件(Extended Events)-- 扩展事件概念解析

SQL Server扩展事件(Extended Events)-- 扩展事件概念解析 下图描述了扩展事件中引入的几个新概念: 事件 事件是指代码中定义的点.此类示例包括:T-SQL 语句完成执行时的点或结束获取锁定时的点.每个事件都有一个定义的负载(该事件返回的列的集合),它是使用 ETW 模型(其中每个事件都返回一个通道和关键字作为负载的一部分)来定义的,以便能够与 ETW 集成.SQL Server 2008 最初提供 254 个定义的事件,预计在今后还会增加. 使用下列代码可以查看这些定义

SQL 扩展事件

在本篇,我通过使用新建“Session ”对话框来创建新的扩展事件会话.定义一个自己的扩展事件,动作和谓词,并且发布一个以收集事件数据为目的的会话. 首先从UI开始 在SQLServer2008R2以后(不包括2008R2),才引入扩展事件的内置UI.2008的版本可以通过安装插件的形式或者使用T-sql语句来实现扩展事件.如果是2012以后的SSMS客户端,也可以访问2008 的数据库实例,但是看不到扩展事件UI.在2008版本中缺少UI,意味着必须写T-SQL和XQuery来挖掘事件数据.2

SQL Server 扩展事件(Extented Events)从入门到进阶(4)——扩展事件引擎——基本概念

本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列 在第一二节中,我们创建了一些简单的.类似典型SQL Trace的扩展事件会话.在此过程中,介绍了很多扩展事件基础组件,包括事件.谓词.操作和目标.本节,将对扩展事件引擎.架构和基本组件做更加深入的了解.通过这些讲解,可以大概了解到为什么扩展事件相对于SQL Trace来说更加低开销.另外,还会延时如何设计事件会话从而最小化事件收集过程中的不必要开销,即使这些事件会话会很复杂. 事件数据收集生命周期: 扩

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

SQL Server扩展事件(Extended Events)-- 性能注意事项

SQL Server扩展事件(Extended Events)-- 性能注意事项 使用 CREATE EVENT SESSION 将扩展事件会话放置在一起时,需要认真正确配置一些设置,因为它们可能会在无意中对性能产生影响.首先需要决定是以同步还是异步方式消耗事件.正如您所料,同步目标对所监控代码的性能产生的影响要大过异步目标. 如前所述,同步消耗某个事件时,触发该事件的代码必须一直等待,直到该事件被消耗为止.显然,如果事件消耗是一个复杂的过程,则这可能会降低代码的性能. 例如,在一个每秒处理数千

SQL Server扩展事件(Extended Events)—使用system_health扩展事件会话

SQL Server扩展事件(Extended Events)-使用system_health扩展事件会话 system_health 会话是 SQL Server 默认包含的扩展事件会话. 该会话在 SQL Server 数据库引擎启动时自动启动,并且运行时不会对性能造成任何明显影响. 该会话收集的系统数据可用于帮助对数据库引擎的性能问题进行故障排除. 因此,我们建议您不要停止或删除该会话. 此会话源自产品支持团队的想法,它可以跟踪通常被用来对客户系统进行调试的信息(例如当客户系统发生死锁或出