Technology へようこそ
ここは技術者の「経験」と「ノウハウ」のブログです


--年--月--日

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


2008年11月08日

SQLエージェントジョブの実行間隔

SQL Serverでの定期実行タスクを管理するSQL Server Agentサービス。
SQL Agentでは最短 1分周期でジョブのスケジューリングが可能なのですが、ジョブが規定時間内に終了しなかった場合、次回のジョブ実行がどのようなタイミングになるのか調べてみました。(検証対象はSQL Sever 2005)
単純に長時間のジョブが重複して実行されないか心配だっただけなのですが、案外微妙な挙動を示すようです。

20081108.jpg

普通に考えて、現在のジョブが実行中にもかかわらず次のジョブが実行されてしまうなどという情けない実装は考えにくいわけで、当然のことながらそのような動きはしません。
次に考えるのは、ジョブが終了した時点から(1分周期なら)1分後に次のジョブが動くのではないか、ということ。
実はこれも外れでして、正解は「あらかじめ定められた次回の実行タイミングに次のジョブが実行される」です。
気になるのは「あらかじめ定められた次回の実行タイミング」というのはどのように決まるのか、という問題ですが、これには『一日のうちの頻度』-『開始(時刻)』の設定が影響してきます。
『一日のうちの頻度』-『間隔』が実行周期を指すわけですが、この実行周期が「分」単位の場合は、『開始(時刻)』で設定している「秒」が反映され、「毎分xx秒」のタイミングでジョブが実行されます。
実行周期が「時間」単位の場合は、『開始(時刻)』の「分秒」が反映されることとなり、「毎時xx分xx秒」のタイミングになるわけです。
ちょっと分かりにくいので、例示すると次のようになります。
A) 間隔= 1分、開始= 15:00:05 の場合

    ・15:00:05 に最初のジョブが起動
    ・(15:01:05におけるジョブ実行はスキップ)
    ・15:01:30 に最初のジョブが終了
    ・15:02:05 に次のジョブが起動

B) 間隔= 1時間、開始= 15:01:10 の場合

    ・15:01:10 に最初のジョブが起動
    ・(16:01:10におけるジョブ実行はスキップ)
    ・16:30:30 に最初のジョブが終了
    ・17:01:10 に次のジョブが起動
要するに、実行タイミングの決定には『開始(時刻)』の設定がさりげなく反映されているということのようです。
xx分周期、xx時間周期といっても、ジョブの処理時間までは当然ながら考慮できないので、このような仕様になっているのでしょう。
[ posted by ken ]

この記事に対するコメント


この記事に対するコメントの投稿














管理者にだけ表示を許可する



この記事に対するトラックバック
トラックバックURL
http://comfair2.blog24.fc2.com/tb.php/397-9d88f04a
この記事にトラックバックする(FC2ブログユーザー)











上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。