Trace-如何跟踪某个Job的开销
1、背景
下面是从以往Profiler收集的跟踪文件中提取Job有关数据
;with cte as(
select b.Name EventClass,TextData,DatabaseName,Duration/1000 Duration_ms
,CPU CPU_ms,Reads,Writes,StartTime,EndTime,HostName,LoginName,ApplicationName
,row_number() over(partition by ApplicationName order by CPU desc) rankid
from fn_trace_gettable(N'F:\TroubleShooting\Trace\InstanceName_HighCPU40_20160907.trc', 1) a
inner join sys.trace_events b
on a.EventClass=b.trace_event_id
where ApplicationName like '%SQLAgent - TSQL JobStep%'
)
select * from cte where rankid=1
order by CPU_ms desc

如何快速定位问题语句归属哪个Job?
1.1、关键字匹配
使用TextData中的关键字到msdb.dbo.sysjobsteps中的command中匹配
select sj.name,sjs.command,sjs.step_id
from msdb.dbo.sysjobs sj
inner join msdb.dbo.sysjobsteps sjs
on sj.job_id=sjs.job_id
where sjs.command like '%FishGameReturnRateStatistics%'

根据返回的Job名称,结合Job历史记录、问题语句Duration,基本可以定位到确切的Job。
存在问题,如果问题语句是一段很长的SQL,而非存储过程,关键字的划定直接影响定位的命中率,进而影响查找时间。
1.2、Job_id匹配
我们注意看第一张图中的ApplicationName列,SQLAgent - TSQL JobStep (Job 0xCFAF657344E1624E98B1DD4676CC18EC : Step 7),有点像是某个Job的第7个步骤。会是哪个作业,中间那串"16进制"与Job_id有什么关系?
--补充 16:22 2017/8/9 根据ApplicationName得到作业名称
select job_id,name from msdb.dbo.sysjobs
where job_id=convert(uniqueidentifier,0xCFAF657344E1624E98B1DD4676CC18EC)
2、ApplicationName与Job_id的关系
为了核查ApplicationName与Job_id的关系,创建一个跟踪,列筛选器添加对TextData筛选,作业运行得到跟踪结果
我们再来看作业的Job_id
将ApplicationName列与Job_id对比
ApplicationName:0x9C91EB5022BD9F4D94FEA58A22571EBA
Job_id:50EB919C-BD22-4D9F-94FE-A58A22571EBA
适当调整样式
ApplicationName:0x-9C91EB50-22BD-9F4D-94FE-A58A22571EBA
Job_id : 50EB919C-BD22-4D9F-94FE-A58A22571EBA
是否发现了什么?在16进制中,每两个进制数字表示一个字节,并且是逆序排列的。
那么16进制的9C91EB50对应的实际是50EB919C;16进制的22BD对应的实际是BD22;16进制的9F4D对应的实际是4D9F。剩下的部分ApplicationName与Job_id是一致的,至于为什么这样保存,暂时没找到相关资料。我也只是通过对比,发现存在这样的现象,并推测ApplicationName与Job_id可以进行互转
use msdb
go
create function [dbo].[JobIdToApplicationName](@job_id varchar(36))
returns varchar(38)
as
begin
declare @str varchar(38)
select @str='Job 0x'
+substring(@job_id,7,2)+substring(@job_id,5,2)+substring(@job_id,3,2)+substring(@job_id,1,2)
+substring(@job_id,12,2)+substring(@job_id,10,2)
+substring(@job_id,17,2)+substring(@job_id,15,2)
+replace(substring(@job_id,20,17),'-','')
return @str
end
go
结合msdb.dbo.sysjobs就可得到所有Job对应的ApplicationName
use msdb
go
select name,job_id,[dbo].[JobIdToApplicationName](job_id) SubApplicationName
from msdb.dbo.sysjobs

3、回归主题
前两天打算跟踪一个作业执行情况,事先查看作业是直接调用存储过程,而存储过程中还会调用其他的存储过程,类似下面
CREATE PROC pro_Parent
AS
BEGIN
EXEC pro_sub1
EXEC pro_sub2
...
END
GO
习惯性的选择RPC:Completed和SQL:BatchCompleted事件,并在列筛选器对TextData应用类似于pro_sub1、pro_sub2(两边需用%)
结果第二天上班,查看跟踪数据时,什么都没有!这是由于自己疏忽,在创建跟踪前还提醒自己要添加SP:Completed事件,最后还是给忘了。又是习惯+疏忽!
我想表达的问题是,如果一个Job调用父存储过程,然后父存储过程中又调用子存储过程,如何在Profiler中只得到此Job相关的父存储过程和子存储过程的消耗情况?添加SP:Completed事件,然后TextData应用类似于各父、子存储过程。如果子存储过程很多呢?这样添加略显笨拙。
如果Job调用的是很长的SQL Batch,如何跟踪这个作业的消耗情况?
想想前面的ApplicationName,我们可以根据Job_id得出Job在Profiler中的ApplicationName列的关键信息。然后针对ApplicationName设置筛选器,不管Job执行什么样的脚本,我们都能方便地获取需要事件的信息。
因此对前两天跟踪Job的那个例子,就可以将下面的SubApplicationName应用于ApplicationName列筛选器,当然还需要加上SP:Completed事件
4、总结
只要有了ApplicationName与Job_id的对应关系,不管我们是要跟踪某个Job执行情况,还是要将Profiler结果定位到具体Job,都十分便捷。
Trace-如何跟踪某个Job的开销的更多相关文章
- SQL Server 默认跟踪(Default Trace)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 查看默认跟踪信息(Default Tr ...
- SQL Server中关于跟踪(Trace)那点事
前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
- 【转】SQL Server中关于跟踪(Trace)那点事
前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
- SQL Server中关于跟踪(Trace)那点事(转载)
前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
- 深入了解跟踪(trace)
深入了解跟踪(trace) 转自:https://www.cnblogs.com/zhijianliutang/p/4113911.html 前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们 ...
- SQL Server 默认跟踪(Default Trace)介绍使用
背景 当数据库的表.存储过程经常别修改,当这些修改造成BUG的时候,很多开发都不承认是他们干的,那我们有没办法找出谁干的呢? SQL Server有Default Trace默认跟踪,数据库记录信息到 ...
- 【转贴】SQL Server中关于跟踪(Trace)那点事
SQL Server中关于跟踪(Trace)那点事 https://www.cnblogs.com/zhijianliutang/p/4113911.html 作者很牛B.. 前言 一提到跟踪俩字,很 ...
- 【监控笔记】【1.2】监控事件系列——SQL Trace(默认跟踪与自定义跟踪)
目录: [1.1]概念与使用 [1.2]跟踪的基本操作 --[1.2.1]查看默认跟踪是否在运行 --[1.2.2]开启默认跟踪 --[1.2.3]关闭默认跟踪 --[1.2.4]查看跟踪文件/查看跟 ...
- Google Dapper-大规模分布式系统的基础跟踪设施
[说明:本文是阅读Google论文"Dapper, a Large-Scale Distributed Systems Tracing Infrastructure"之后的一个简要 ...
随机推荐
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- vs2008所有DTE.ExecuteCommand命令
下面列表中为我当前机器上visual studio 2008所有DTE.ExecuteCommand命令的内容: 其中:Build.开头对应“编译”菜单下命令(如:Build.RebuildSolut ...
- 百度地图-省市县联动加载地图 分类: Demo JavaScript 2015-04-26 13:08 530人阅读 评论(0) 收藏
在平常项目中,我们会遇到这样的业务场景: 客户希望把自己的门店绘制在百度地图上,通过省.市.区的选择,然后加载不同区域下的店铺位置. 先看看效果图吧: 实现思路: 第一步:整理行政区域表: 要实现通过 ...
- VS2012无法打开文件“kernel32.lib”问题的解决办法
后来经过百度搜索发现解决办法: 1.在项目属性[VC++目录]下的 [包含目录] 添加 $(WindowsSDK_IncludePath) ,在[库目录]添加$(WindowsSDK_LibraryP ...
- js常见报错之Unexpected token in JSON at position
源头 出现这个报错提示,根本原因只有一个--json解析异常,所以请大家直接去关注自己json的返回数据注意检查其返回内容和内容的格式是否正确,至于本文血案的导火索是因为json注释滴问题. 事发 ...
- hierarchyid
hierarchyid: http://www.cnblogs.com/shanyou/archive/2011/07/01/2095968.html RABBITMQ: http://www.rab ...
- psql-09表:视图和索引
视图 由查询语句定义的虚拟表;从视图中看到的数据可能来自数据库中的一张或多张表,也可能来自外部; 使用视图的原因一般有: 使复制的查询易于理解和使用; 安全原因; 表一些函数返回的结果映射成视图; 一 ...
- 分布式缓存技术redis学习系列(二)——详细讲解redis数据结构(内存模型)以及常用命令
Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...
- Entity Framework 实体框架的形成之旅--实体数据模型 (EDM)的处理(4)
在前面几篇关于Entity Framework 实体框架的介绍里面,已经逐步对整个框架进行了一步步的演化,以期达到统一.高效.可重用性等目的,本文继续探讨基于泛型的仓储模式实体框架方面的改进优化,使我 ...
- 首师大附中互测题:50136142WXY的坑爹百度地图【B006】(可以喝的超大桶水)
[B006]50136142WXY的坑爹百度地图[难度B]——————————————————————————————————————————————————————————————————————— ...