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】没有执行的时候,执行

posted @ 2020-06-17 13:49  郭大侠1  阅读(330)  评论(0编辑  收藏  举报