sql server2005中作业没有秒级间隔怎么办?
【1】问题:sql server2005作业做小时间间隔为分
sql server2005作业做小时间间隔为分,这可愁坏个人。补丁到SP3就有秒了,不打补丁包的话继续看下面把。
【2】解决办法
【2.1】循环法+waitfor delay
建一个每分钟的作业再加上While+wait for
declare @i int set @i=0 while @i<2 begin exec('delete from tbMSG where datediff(s,dt_MSG_InsertTime,getdate())>120') waitfor delay '00:00:30' set @i=@i+1 end
问题:这个方案看起来是没什么问题,但是会导致整个作业每两分钟执行一次。
为什么呢?举个例子:
00:01:00 作业运行;
00:02:00 本次作业触发发现作业未执行完,故忽略;
00:03:00 上次作业完成,启动作业运行。
解决:
因为作业操作/作业整理相关信息,也需要时间,这个时间大概需要3秒以上,建议以5秒为间隔。
也就是,把上文的 waitfor delay 时间改成 26或者27秒,这样每分钟就可以了。
【2.2】网络上的笨方案:分成多个作业
每一分钟要执行几次就写几个独立作业,再结合wait for
如:每20s执行一次:
1.delete from tbMSG where datediff(s,dt_MSG_InsertTime,getdate())>30
2.waitfor delay '00:00:20'
delete from tbMSG where datediff(s,dt_MSG_InsertTime,getdate())>30
3. waitfor delay '00:00:40'
delete from tbMSG where datediff(s,dt_MSG_InsertTime,getdate())>30
【2.3】最佳实践:写个大循环
【2.1】中的办法,相当于每分钟都要浪费个几秒,其实很亏
3600*24/30=2880,也就是一天需要跑2880次,这里我们让个20次,留给作业时间就好了。如下:
declare @i int set @i=1 while @i<=2860 begin exec('delete from tbMSG where datediff(s,dt_MSG_InsertTime,getdate())>120') waitfor delay '00:00:30' set @i=@i+1 end
要是想完美解决,那么可以再弄一个【2.1】设置好时间,做好判断当【2.3】没有执行的时候,执行