zoukankan      html  css  js  c++  java
  • 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】没有执行的时候,执行

  • 相关阅读:
    VC CComboBox用法总结
    WideCharToMultiByte和MultiByteToWideChar函数的用法
    JavaScript
    标题:外星日历
    C语言顺序栈
    C语言循环队列
    每日一题
    标题:李白打酒
    标题:分数
    标题:复数幂
  • 原文地址:https://www.cnblogs.com/gered/p/13152052.html
Copyright © 2011-2022 走看看