查看SQLServer 代理作业的历史信息
不敢说众所周知,但是大部分人都应该知道SQLServer的代理作业情况都存储在SQLServer5大系统数据库(master/msdb/model/tempdb/resources)中的MSDB中,而由于代理作业的长期运行和种类较多,所以一般可以看到msdb的大小往往比其他库加起来还大。本文主要专注在如何查询作业的运行时间点及运行持续时间上。
作为DBA,周期性检查作业情况是一下非常重要的任务。本文不讲述太深入。只讲述如何查询作业的历史运行情况。并加入一下在联机丛书上没有提及,也就是所谓的未公开的系统函数。
作业执行的历史信息存放在msdb.dbo.sysjobhistory中。但是在这个表里面,日期和时间列的显式方式会有点不常规,这就引出了本文的意图。首先我们来看看表里的数据,这里需要关联一下sysjobs表:
SELECT j.name AS 'JobName' ,
run_date ,
run_time
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName ,
run_date ,
run_time DESC
运行上面的代码,得到以下的结果:

可以看到run_date这列,虽然能看得懂,但是是YYYYMMDD这样的格式,用起来可能有点不方便。而run_time就更加难用了。Run_time中的180002意味着:18:00:02执行。这些不直观的数据对时常需要使用的DBA来说是一种痛苦,当然,可以通过字符串函数来转换成自己喜欢看的格式。但是这里提供一个微软未公开的函数:
MSDB.dbo.agent_datetime(run_date,run_time)
它会返回一个比较常规的日期格式,使得使用和查看的时候都很方便,作为一个未公开的函数,对其的了解不多只需要会用就可以了。可以使用下面的例子:
SELECT j.name AS 'JobName' ,
run_date ,
run_time ,
msdb.dbo.agent_datetime(run_date, run_time) AS 'RunDateTime'
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName ,
RunDateTime DESC
结果转换后,得到下面的结果:

可以看到经过函数格式化之后,数据已经很直观了。特别注意,这个未公开函数是从2005以后才引入,2000是没有的。只能通过字符串处理来获得同样的效果。
现在再来看看另外一列,run_duration,运行持续时间,同样,这列是int类型,也和run_time一样,不直观。
SELECT j.name AS 'JobName' ,
run_date ,
run_time ,
msdb.dbo.agent_datetime(run_date, run_time) AS 'RunDateTime' ,
run_duration
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName ,
RunDateTime DESC
结果如下:

这列两位数代表仅仅是秒,3位数代表秒和分。单纯从这里比较难看出作业的运行时间。对分析不利。比较遗憾的是没有另外的存储过程来转换这列,所以需要自己编写代码,可以用下面的代码来转换:
SELECT j.name AS 'JobName' ,
run_date ,
run_time ,
msdb.dbo.agent_datetime(run_date, run_time) AS 'RunDateTime' ,
run_duration ,
( ( run_duration / 10000 * 3600 + ( run_duration / 100 ) % 100 * 60
+ run_duration % 100 + 31 ) / 60 ) AS 'RunDurationMinutes'
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName ,
RunDateTime DESC
为了方便展示,这里我筛选了持续时间比较长的几个作业。

对于很多ETL的作业,可能会有很多步骤,下面来把这些步骤也带出来,这就要关联另外一个表msdb.dbo.sysjobsteps:
SELECT j.name AS 'JobName' ,
s.step_id AS 'Step' ,
s.step_name AS 'StepName' ,
msdb.dbo.agent_datetime(run_date, run_time) AS 'RunDateTime' ,
( ( run_duration / 10000 * 3600 + ( run_duration / 100 ) % 100 * 60
+ run_duration % 100 + 31 ) / 60 ) AS 'RunDurationMinutes'
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobsteps s ON j.job_id = s.job_id
INNER JOIN msdb.dbo.sysjobhistory h ON s.job_id = h.job_id
AND s.step_id = h.step_id
AND h.step_id <> 0
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName ,
RunDateTime DESC

通过这个查询,可以检查到具体哪个作业运行时间最长,然后进行检查和优化。对于SQLServer 代理作业还有很多事情要做,由于主题原因,也不可能一篇就全部说完,将在后续文章中说明。
从代理作业中检查性能问题只是查询性能问题及检查数据库运行情况的手段之一,很多数据库管理方面的操作其实往往不是单一的,而是一系列的操作合成的。但是学会一种工具,你就多了一样利器。
查看SQLServer 代理作业的历史信息的更多相关文章
- SSIS实践入门2:批量包的调度和SQLServer代理作业配置
趁着上一篇文章的余温,我们继续研究一下SSIS中多个包如何调度,难道需要一个包一个包的配置调度程序吗?显然不是的,接下来我们就说一说在SSIS应用中如何批量的调度所有的作业,本文只讲述一个基本的逻辑过 ...
- SqlServer代理作业
最近一直在学习SqlServer 作业方面的知识,总结一下. 一:作业存在的库. msdb use msdb Msdb数据库是代理服务数据库,为其报警.任务调度和记录操作员的操作提供存储空间. 二: ...
- (原)SQL Server 代理作业执行持续时间简述
本文目录列表: 1.SQL Server 代理作业概述2.获取代理作业执行时间方法一 3.获取代理作业执行时间方法二4.总结语 5.参考目录清单列表 正文: 1.SQL Server 代理作业概述 ...
- SqlServer中代理作业实现总结
今天弄SqlServer代理作业,弄了半天,把遇到的问题总结出来,主要是抨击一下Sql Server的Express版本.好了,看下面的正题. 首先,需要安装Sql Server Agent服务,该服 ...
- SQLServer复制(二)--事务代理作业
之前的一篇已经介绍了如何配置复制,介绍了发布者.分发者和订阅者以及事务日志运行的简单关系.其中提到了复制代理,我们这篇将详细介绍复制代理,它是什么?在事务复制的步骤中起到了什么作用? 代理和工作 首先 ...
- SqlServer代理执行[分发清除: distribution] 无法删除快照文件
每天偶尔检查数据库作业是否失败,发现有错误 select top 10 job_id,run_date,run_time,run_duration,step_name,message from ms ...
- SQL邮件服务(解决各种疑难杂症)+案例 + 使用SQLserver 邮件系统发送SQL代理作业执行警告
首先你需要知道你要做的几部: 1 每个数据库都有自己的 SERVICE BROKER 很多SQL SERVER内部服务依赖它 2 启动 SERVICE BROKER 需要 1 STOP 你的 SQL ...
- 利用SqlServer的作业定时清除过期数据
有时候我们的数据库中可能会有那么些存放动态数据的表,比如一些每天定时发出的消息通知信息等数据.这些数据我们只需要临时保存,一些老旧的数据需要定时去清除掉,不然时间一长的话单表数据堆积非常严重.导致数据 ...
- SQL SERVER 2008复制数据库时发生执行SQL Server代理作业错误
1. 情况说明 在利用SQL SERVER数据库复制向导,能够很方便的将一个数据库从一台服务器复制到另一台服务器上,具体操作步骤也十分简单. 不过在实际操作过程常发生“执行SQL SERVER代理作业 ...
随机推荐
- hdu4857 逃生 bestcoder round1 A
题目要求要求在满足约束条件的情况下,使小的序号尽力靠前. 坑点就在这里.小的序号尽量靠前并非代表字典序,它要求多种情况时,先使1靠前(可能1仅仅能在第2或第3位 那么就要使它在第2位),其次2,3. ...
- Linux C语言写的超级简单port扫描器
这个本来曾经也写过的,今天无聊复习下 再写一遍.简单的一塌糊涂,写的不咋地大家见谅哦!有空再加强 嘿嘿! #include <stdio.h> #include <stdlib.h& ...
- MySQL在大数据Limit使用
它已被用于Oracle一世.但今天,很惊讶,MySQL在对数量级的性能,甚至差距如此之大不同的顺序相同的功能. 看看表ibmng(id,title,info) 只要 id key 指数title ...
- Storm On YARN带来的好处
1)弹性计算资源 将storm执行在yarn上后.Storm能够与其它计算框架(如mapreduce)共享整个集群的资源.这样当Storm负载骤增时,可动态为它添加计算资源. 负载减小时,能够 ...
- HTML5 在canvas绘制一个矩形
笔者:本笃庆军 原文地址:http://blog.csdn.net/qingdujun/article/details/32930501 一.绘制矩形 canvas使用原点(0,0)在左上角的坐标系统 ...
- hdu-2814-Interesting Fibonacci-斐波那契周期节
哇,其实我2A该....否1A纯脑损伤.. 乞讨:F(a^b)^(F(a^b) ^ (n-1))%c 既是求F(a^b)^(F(a^b) ^ (n-1)%phi[c]+phi[c])%c 先求x=F ...
- WCF扩展之实现ZeroMQ绑定和protocolBuffer消息编码(一)概要设计
在我工作的项目中含有多种操作系统.多种设备.多种开发语言,因此需要使用跨平台的通信技术和自定义的消息编码.经过技术调研,ZeroMQ+ProtocolBuffer最终成为通信技术和编码方式.但是如 ...
- [Windwos Phone] 实作地图缩放 MapAnimationKind 属性效果
原文:[Windwos Phone] 实作地图缩放 MapAnimationKind 属性效果 [前言] 使用经纬度来定位地图的位置,以及使用 MapAnimationKind 属性来设定地图缩放时的 ...
- C++primer读书笔记9-转换和类类型
有时指定自己的类类型来表示某些类型的数据,如SmallInt,然后在为了便于计算将指定一个转换算,类类型,在某些情况下,自己主动转换为指定的类型 <1>转换操作符 operator typ ...
- web.xmlf多ilter在执行顺序
1.随着url-pattern路配置filter请务必先实施servlet-name路配置filter 2.随着url-partern路配置filter于.,按web.xml于filter-ma ...