利用扩展事件(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
利用扩展事件(Xevents)捕捉高消耗查询的更多相关文章
- 利用扩展事件进行调优和Troubleshooting PPT分享
本篇主题是我在2015年中国数据库大会(DTCC)上的分享,扩展事件从2008版本出来到现在已经有6-7年,国内却很少有相关资料和使用,现在分享一下PPT,希望对大家有所帮助. 可 ...
- SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events
由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...
- 【监控笔记】【2.3】扩展事件——慢查询SQL(执行超过3S的SQL)
--sql server 2008及以上才支持,2012及以上才支持GUI界面 msdn 扩展事件:点击打开链接 [1]T-SQL实现 基于 rpc_completed(远程过程调用已完成时发生) 事 ...
- 通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?
原文:通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了? 问题就是,一个很简单的语句,在不同的服务器上执行,所需要的时间相差很大,特别提到在性能差的服务器上反而快,在性能 ...
- C++ //多态案例 -计算器类(普通写法 和 多态写法) //利用多态实现计算器 //多态好处: //1.组织结构清晰 //2.可读性强 //3.对于前期和后期扩展以及维护性高
1 //多态案例 -计算器类(普通写法 和 多态写法) 2 3 #include <iostream> 4 #include <string> 5 using namespac ...
- 如果正确读取SQL Server中的扩展事件?
SQL Server中使用扩展事件捕捉所需的信息后,可以选择存放的位置.比如说内存或文件中,但无论存在哪里,其本质都是一个大XML.因此在SQL Server中读取该XML就是解析扩展事件结果 ...
- SQL 扩展事件
在本篇,我通过使用新建“Session ”对话框来创建新的扩展事件会话.定义一个自己的扩展事件,动作和谓词,并且发布一个以收集事件数据为目的的会话. 首先从UI开始 在SQLServer2008R2以 ...
- SQL Server 扩展事件(Extented Events)从入门到进阶(4)——扩展事件引擎——基本概念
本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列 在第一二节中,我们创建了一些简单的.类似典型SQL Trace的扩展事件会话.在此过程中,介绍了很多扩展事 ...
- SQLServer中使用扩展事件获取Session级别的等待信息以及SQLServer 2016中Session级别等待信息的增强
本文出处:http://www.cnblogs.com/wy123/p/6835939.html 什么是等待 简单说明一下什么是等待:当应用程序对SQL Server发起一个Session请求的时候, ...
随机推荐
- mysql错误用法insert into where
mysql中给表中插入数据,一般使用insert into. 但是在插入数据时,有时会根据条件来插入数据,比如insert into t_person(num,name) values(1,'lily ...
- RegExp 对象的三个方法:compile()、exec()、test()
这三个都是RegExp对象下的三个方法,使用方法是一致得. 使用方法:RegExpObject.方法() 方法解析:其实就是根据定义好的正则对象,调用对应的方法. 1.RegExpObject.com ...
- BackgroundWorker控件
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...
- nullcon HackIM2016 -- Programming Question 3
Still Hungry and unsutisfied, you are looking for more. Some more, unique un heard dishes. Then you ...
- java打包遇到问题java.io.IOException: invalid header field
问题:java打包时报以下错误 $ jar -cvmf main.txt test.jar Shufile1.class java.io.IOException: invalid header fie ...
- .Net的错误机制
//优先级1 protected void Page_Error(object sender, EventArgs e) { Exception objErr = Serv ...
- HQL
以下内容全部摘自韩顺平老师Hibernate笔记 * uniqueResult方法 如果我们检索一个对象,明确知道最多只有一个对象,则建议使用该方法: 具体用法如下: Student s=(Stude ...
- CoreData创建
云盘-->CoreData文件 一 创建表打开点击增加的Entity名字应该与 EntityForName一致 二 创建NSManageObject SubClass 三 拖进CoreD ...
- Redis过期时间
上次开发用了redis后效果不错,后来在进阶的开发中查询到,如果redis一直不释放也会占用内存,于是就想着给redis加上个过期时间. 具体操作很简单,只要在设置redis的时候加上exp就可以了, ...
- 心情闲适,发几个tatanic的图
第一次看这个是98年在高一的同学家里. 唯一的月末休息时,那时没有电话,老父以为我会在下午到caojp,结果老父在寒风中等我一个下午,发火了.