利用扩展事件(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请求的时候, ...
随机推荐
- 6. js时间比较
var v0 = ABS_DATESTRING(O_PARAMETER.FDate,"yyyy/MM/dd")var v_beginTime = v0 + " " ...
- java 动态编译
public class Main { public static void main(String[] args) { System.out.println("Hello World!&q ...
- C语言 malloc、calloc、realloc的区别
三个函数的申明分别是: void* malloc(unsigned size); void* realloc(void* ptr, unsigned newsize); void* calloc(si ...
- table奇偶行设置颜色代码
- spring junit
转载自 http://blog.csdn.net/funi16/article/details/8691575 在写单元测试的时候,一般是对数据库进行增删改查的操作,这个时候,如果之前删除了某条记录, ...
- SQL触发器中的deleted表和inserted表
SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...
- Selenium2+python自动化12-操作元素(键盘和鼠标事件)
前言 在前面的几篇中重点介绍了一些元素的到位方法,到位到元素后,接下来就是需要操作元素了.本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件 有些web界面的选项菜单需要鼠标悬停在某个元素 ...
- PHP各种缓存
缓存类型PHP缓存包括PHP变异缓存和PHP数据缓存两种:PHP编译缓存: PHP数据缓存: 对数据库数据进行缓存 对PHP模板数据缓存 js数据缓存
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...
- SQL Server 查看物理页存储
创建测试表 Use Test create table dbo.employee( emp_lname varchar(12) not null, emp_fname varchar(12)not n ...