web-dev-qa-db-ja.com

継続的に実行されているエージェントジョブのインスタンスを1つ持つのと、そのジョブを1日に何度も起動するのとのどちらが良いですか。

1日に約12時間、毎秒実行する必要があるSQLクエリがあります。これは、いくつかのデータを分離されたテーブルに記録する非常に単純なクエリです。現時点では、WHILEループ内のローカルSSMSクライアントで実行したままにしており、WAITFOR DELAY '00:00:01'を使用して、各反復間で1秒間休止します。

これをエージェントジョブに移動する場合は、ジョブを12時間にわたって1秒ごとに実行するようにスケジュールするか、クエリをそのままにして朝に1回ジョブを実行して、クエリが頻繁に実行されます。 (覚えておかなければならないことの1つは、クエリは通常、実行時間が1秒未満になるほど高速であることですが、実行が完了するまでに数秒かかることはめったにありません。)

根本的な質問は、12時間継続して実行されるジョブ、または約43,000回実行されるジョブ(1秒に1回、12時間)の方が良いのではないかと思います。

1
J.D.

ジョブが開始するたびに一定量のオーバーヘッドが発生します。状態の追跡や計算のスケジュール、セッションの作成などのためにmsdbで読み取りと書き込みを行います。したがって、効率の観点から、ループで実行することをお勧めします。また、ジョブが開始されると、ジョブが実際にコードの実行ポイントに到達するまでに時間がかかるため、1秒ごとに実行されるようになります。そのため、実際にコードの実行ポイントに到達するまでにジョブで.25秒のランダムな遅延が発生した場合は、コードの実行の間にかなりのギャップがある可能性があります。ログインプロセス全体を実行する必要があるため(間違っている場合は誰かが私を修正してください)、ネットワークの問題が原因で認証プロセスに遅延が発生する可能性があると思います。

ループで実行することの欠点は、コード内のエラーを処理する必要があることです。ジョブが毎秒実行される場合、ジョブの失敗通知を設定でき、問題がある場合はメールが送信されます。ループで実行される場合は、コードでエラーと通知を処理し、ジョブが実行されていることを確認するためにジョブを監視する必要があります。

5
Tony Hinkle

私はループのある1つのジョブに行き、あなたに合った条件に基づいてループでBREAKを実行します。

ただし、問題が発生してジョブが終了した場合は、このジョブを実行せずにどれだけの期間を存続させることができるかを判断する必要があります。 IMOの最も簡単な方法は、ジョブを毎分実行するようにスケジュールすることです。ジョブがすでに実行されている場合、エージェントは2番目のインスタンスを開始しません。

1
Tibor Karaszi