Trace-跟踪高消耗的语句需添加哪些事件
通常接手一台数据库服务器后,我们会开启Profiler跟踪来了解SQL Server的繁忙情况。我们首先会想到的是监控CPU或Duration超过某一阈值的语句/过程。那么所创建的Trace添加哪些事件和列比较合适?
新建跟踪,默认模板会选择Audit Login、Audit Logout、ExistingConnection、RPC:Completed、SQL:BatchCompleted、SQL:BatchStarting这些事件。但我们稍作修改,下表中给出跟踪查询结束的事件:
事件类 | 事件 | 说明 | 备注 |
Stored Procedures | RPC:Completed | RPC完成事件 | |
SP:Completed | 存储过程完成事件 | 所有执行的存储过程(过程中调用其他过程,也能跟踪到) | |
SP:StmtCompleted | 在存储过程中一条SQL语句完成事件 | 捕捉单条语句代价过高 | |
T-SQL | SQL:BatchCompleted | T-SQL批完成事件 | |
SQL:StmtCompleted | 一条T-SQL语句完成事件 | 捕捉单条语句代价过高 |
选择表中的事件,加上Exception异常事件,选择列在默认的基础上增加DatabaseID、DatabaseName、Error、HostName,设置完成后的跟踪属性如下:
点击运行,在查询窗口选择对应数据库执行下面语句:
DBA_Pro_GetJobSchedules '20151215 07:00:00.000','20151215 08:00:00.000'
WAITFOR DELAY '00:00:03'
SELECT GETDATE()
GO
跟踪结果如图所示:
我们来分析语句是如何执行的:整段语句是一个批处理语句,因此在跟踪的最后面有一个SQL:BatchCompleted事件(红框),对应的TextData是三行批处理语句。三行语句对应三个SQL:StmtCompleted事件(橙框)。测试中故意在DBA_Pro_GetJobSchedules过程的结尾加上一句exec uest.uest_test,因此我们看到两个SP:Completed事件(紫框)。DBA_Pro_GetJobSchedules过程是用来查看指定区间内作业执行情况,过程由很多条SQL语句组成;exec uest.uest_test过程只是从sys.objects获取10条类型为表的记录,exec uest.uest_test对于DBA_Pro_GetJobSchedules来说是过程中的一条SQL语句,因此我们可以看到很多SP:StmtCompleted事件(蓝框+蓝下划线)。
仔细查看发现很多"重复"代码,对于本例中其实我们只要知道SQL:BatchCompleted事件,就可以通过查看过程涉及代码继续分析,而不用每次都把过程中涉及的语句全部跟踪出来。SP:StmtCompleted或SQL:StmtCompleted事件捕捉单独的语句可能是代价很高的操作,这取决于单独语句的数量。如果过程中有多条语句,而且这些过程中有些使用其他语句调用其他过程。收集所有这些额外的数据对生产环境的影响可能会非常大。
我们再看SP:Completed事件,查询窗口执行的语句只有一个过程,只是过程中又调用了另一过程。SP:Completed事件把两个过程都跟踪出来了。这个事件对于临时跟踪某个过程执行情况很有用。之前有遇到过,在没有选择此事件的情况下,去跟踪某个过程的执行情况,Profiler下怎么也看不到,但在sys.dm_exec_procedure_stats视图下却发现过程一直被调用。后面只能通过查询它的依赖关系,将调用它的所有过程找出来,再针对那些过程去跟踪!还是来看前面的例子,是否有必要在第一次的时候将此事件添加进去?不添加,有些过程在我们的跟踪文件中永远都看不到它们的身影,可实际上它们可能被频繁调用。添加,SP:Completed事件和SQL:BatchCompleted事件中的TextData内容会有重复,如果我们不加筛选去分析某个过程的执行次数、消耗可能就会出错。个人觉得,首次跟踪不必添加,我们先把消耗大的过程/语句找出来,然后会对那些过程去分析,自然会去查看过程涉及的代码,到时自然能知道是哪段代码消耗过高,再去细化便可。
于是去掉SP:Completed事件、SP:StmtCompleted和SQL:StmtCompleted事件:
编辑列筛选器,CPU>=0 ms,1 ms<=Duration<=10000 ms,运行跟踪,查询窗口执行下面语句:
DBA_Pro_GetJobSchedules '20151215 07:00:00.000','20151215 08:00:00.000'
跟踪窗口如图所示:
利用导出已有的服务器端跟踪中的脚本提取上面跟踪的定义:
/************************************************************
* 功能说明:查询跟踪目录视图得到运行中的服务器端跟踪定义
* 注意事项:如果要运行提取出的跟踪定义,请注意调整筛选条件部分参数赋值的位置
************************************************************/
-- Create a Queue
DECLARE @rc int
,@TraceID int
,@MaxFileSize bigint=50
,@DateTime datetime=null EXEC @rc = sp_trace_create @TraceID output ,0,N'InsertFileNameHere', @MaxFileSize, @DateTime
if (@rc != 0) goto error -- Set the events
DECLARE @on bit = 1
EXEC @rc = sp_trace_setevent @TraceID,10,1, @on
EXEC @rc = sp_trace_setevent @TraceID,10,2, @on
EXEC @rc = sp_trace_setevent @TraceID,10,3, @on
EXEC @rc = sp_trace_setevent @TraceID,10,8, @on
EXEC @rc = sp_trace_setevent @TraceID,10,9, @on
EXEC @rc = sp_trace_setevent @TraceID,10,10, @on
EXEC @rc = sp_trace_setevent @TraceID,10,11, @on
EXEC @rc = sp_trace_setevent @TraceID,10,12, @on
EXEC @rc = sp_trace_setevent @TraceID,10,13, @on
EXEC @rc = sp_trace_setevent @TraceID,10,14, @on
EXEC @rc = sp_trace_setevent @TraceID,10,15, @on
EXEC @rc = sp_trace_setevent @TraceID,10,16, @on
EXEC @rc = sp_trace_setevent @TraceID,10,17, @on
EXEC @rc = sp_trace_setevent @TraceID,10,18, @on
EXEC @rc = sp_trace_setevent @TraceID,10,31, @on
EXEC @rc = sp_trace_setevent @TraceID,10,35, @on
EXEC @rc = sp_trace_setevent @TraceID,12,1, @on
EXEC @rc = sp_trace_setevent @TraceID,12,3, @on
EXEC @rc = sp_trace_setevent @TraceID,12,8, @on
EXEC @rc = sp_trace_setevent @TraceID,12,9, @on
EXEC @rc = sp_trace_setevent @TraceID,12,10, @on
EXEC @rc = sp_trace_setevent @TraceID,12,11, @on
EXEC @rc = sp_trace_setevent @TraceID,12,12, @on
EXEC @rc = sp_trace_setevent @TraceID,12,13, @on
EXEC @rc = sp_trace_setevent @TraceID,12,14, @on
EXEC @rc = sp_trace_setevent @TraceID,12,15, @on
EXEC @rc = sp_trace_setevent @TraceID,12,16, @on
EXEC @rc = sp_trace_setevent @TraceID,12,17, @on
EXEC @rc = sp_trace_setevent @TraceID,12,18, @on
EXEC @rc = sp_trace_setevent @TraceID,12,31, @on
EXEC @rc = sp_trace_setevent @TraceID,12,35, @on
EXEC @rc = sp_trace_setevent @TraceID,33,1, @on
EXEC @rc = sp_trace_setevent @TraceID,33,3, @on
EXEC @rc = sp_trace_setevent @TraceID,33,8, @on
EXEC @rc = sp_trace_setevent @TraceID,33,9, @on
EXEC @rc = sp_trace_setevent @TraceID,33,10, @on
EXEC @rc = sp_trace_setevent @TraceID,33,11, @on
EXEC @rc = sp_trace_setevent @TraceID,33,12, @on
EXEC @rc = sp_trace_setevent @TraceID,33,14, @on
EXEC @rc = sp_trace_setevent @TraceID,33,31, @on
EXEC @rc = sp_trace_setevent @TraceID,33,35, @on -- Set the Filters
DECLARE @Intfilter int
,@BigIntfilter bigint
-- 请将参数的赋值放置到对应筛选表达式的前面(如果有的话)
SET @BigIntFilter = 1000--13,0,4
SET @BigIntFilter = 10000000--13,0,5
SET @IntFilter = 0--18,0,4
EXEC @rc = sp_trace_setfilter @TraceID,10,0,7,N'SQL Server Profiler - ca0047c1-71f7-4e31-b634-f9bb3fbce69a'
EXEC @rc = sp_trace_setfilter @TraceID,13,0,4,@BigIntFilter
EXEC @rc = sp_trace_setfilter @TraceID,13,0,5,@BigIntFilter
EXEC @rc = sp_trace_setfilter @TraceID,13,0,1,null
EXEC @rc = sp_trace_setfilter @TraceID,18,0,4,@IntFilter
EXEC @rc = sp_trace_setfilter @TraceID,18,0,1,null -- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1 -- Display trace id for future references
select TraceID=@TraceID
goto finish error:
select ErrorCode=@rc finish:
go
修改跟踪文件存放位置到F:\TroubleShooting\Trace\sample,并将参数的赋值放置到对应筛选表达式的前面。停止原跟踪,执行代码创建并启动新跟踪,再在查询窗口多次执行之前的语句,之后停止并移除跟踪,用Profiler打开新跟踪文件:
上面的跟踪定义基本可以作为首次跟踪的模板,只需调整文件存储位置,及过滤筛选值即可。同时再次验证导出已有的服务器端跟踪脚本的正确性。
Trace-跟踪高消耗的语句需添加哪些事件的更多相关文章
- 利用扩展事件(Xevents)捕捉高消耗查询
生产环境中有时需要使用者抓取一些特定的语句分析,如超超长查询,或高IO查询等.一般来说大家对跟踪比较熟悉,主要因为其有完善的UI支持.由于扩展事件在sql2012才提供UI支持,所以虽然在08时就已经 ...
- 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式
[方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学 ...
- SQL语句的添加、删除、修改多种方法
SQL语句的添加.删除.修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来? 添加.删除.修改使用db.Execute(Sql)命令执行操作╔------- ...
- 向已写好的多行插入sql语句中添加字段和值
#region 添加支款方式--向已写好的多行插入sql语句中添加字段和值 public int A_ZhifuFS(int diqu) { ; string strData = @"SEL ...
- SQL Server 默认跟踪(Default Trace)获取某个Trace跟踪了哪些Event和column
检查Default Trace是否已经开启,如果返回Figure1中value为1,那就说明已经开启默认跟踪了:如果value为0表示关闭默认跟踪: --查询Default Trace是否开启 ; 如 ...
- 转 SQL语句的添加、删除、修改多种方法
SQL语句的添加.删除.修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来? 添加.删除.修改使用db.Execute(Sql)命令执行操作 ╔------ ...
- 使用sql语句实现添加、删除约束
--主键约束(Primary Key constraint):要求主键列的数据唯一,并且不允许为空. --唯一约束(Unique Constraint):要求该列唯一,允许为空,但只能出现一个空值. ...
- ylb:使用sql语句实现添加、删除约束
ylbtech-SQL Server:SQL Server-使用sql语句实现添加.删除约束 --主键约束(Primary Key constraint):要求主键列的数据唯一,并且不允许为空. -- ...
- SQL SERVER 占用资源高的SQL语句
--SQL SERVER 占用资源高的SQL语句: --查询占用cpu高的前 50 个 SQL 语句 SELECT total_cpu_time,[total_physical_Reads], tot ...
随机推荐
- POJ 1845 (约数和+二分等比数列求和)
题目链接: http://poj.org/problem?id=1845 题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1) ...
- 【BZOJ】2741: 【FOTILE模拟赛】L
题意:给定一个长度为n的序列,m次询问,每次询问一个区间[l, r],求max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r.(n< ...
- 清空highcharts数据
1:清空highcharts图表的数据我们常用的方法就是remove() var seriesList = chart.series; //获得图表的所有序列 var seriesCount=seri ...
- C#实现动态页面静态化
制作一个aspx页面,专门用来生成各个动态aspx页面的静态页面.如下图所示,仅将内容页和主页面生成静态页面,当然本例只是一个简单的范例,实际情况如很复杂,但原理都是相同的. 生成内容页: 本例中的不 ...
- nginx“虚拟目录”不支持php的解决办法
这几天在配置Nginx,PHP用FastCGI,想装一个phpMyAdmin管理数据库,phpMyAdmin不想放在网站根目录 下,这样不容易和网站应用混在一起,这样phpMyAdmin的目录就放在别 ...
- Android开发环境--eclipse和Android Studio
一.eclipse下载.安装.配置 因为eclipse是之前就下载过的,现在只能大概说一下eclipse的下载安装过程. 1.下载jdk,配置java环境变量 (1)在官网(http://www.o ...
- MaterialCalendarView使用时遇到的问题
一.概述 MaterialCalendarView是一个开源项目.功能强大支持多选.单选.标注等. 二.问题 1.其继承自ViewGroup,故与CalendarView半毛钱关系都没有,完全是一个新 ...
- Maya 建模完成后的整理
我们在使用Maya建模完成后可能会进行发布,为了自己或他人的方便使用,我们需要对建立好的模型进行些处理: 1. 删除历史记录:选择模型,Edit -> Delete by Type -> ...
- jq遍历url判断是否为当前页面然后给导航上色
举例:我们希望在此页面点击“我的头像”从而加亮它的背景颜色,跟“我的爱好”的背景颜色一样. 之前: 之后: 我是这样实现的:通过判断当前url是否存在某字段,遍历字段所在的位置给加上相应的样式,我这么 ...
- HDU 1421 DP
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...