0

Oracle DBMS_Scheduler には何が適していますか?

  1. 毎回ジョブをスケジュール(無効)に保ちます。必要に応じて有効にして実行します。
  2. ジョブを作成し、実行してドロップします。

テーブル x があり、レコードがそのテーブルに送信されるたびに、そのレコードを処理するジョブが必要です。常にレコードの挿入がある場合とない場合があります..これを念頭に置いて..何が良いでしょうか..?

4

1 に答える 1

1

非同期プロセスでテーブルに表示される行の処理は、さまざまな方法で実行できます。適切な方法を選択してください。

  1. を使用して行を処理する 1 回限りのジョブを作成するトリガーをテーブルに追加しますDBMS_JOB。これは、テーブルに挿入されるデータの量が非常に少なく、常にジョブを実行したくない場合に適しています。の利点はDBMS_JOB、挿入がコミットされるまでジョブが開始されないことです。ロールバックされた場合、ジョブもロールバックされるため実行されません。不利な点は、アクティビティのスパイクが持続する場合、作成されたすべてのジョブが実行中の他のジョブを締め出すことです。

  2. DBMS_SCHEDULER定期的に実行され、新しいレコードのテーブルをポーリングして処理する単一のジョブを作成します。このメソッドには、各レコードを「処理済み」としてマークするために更新できるテーブルの列が必要です。たとえば、挿入時に設定され、処理後にジョブによって設定VARCHAR2(1)されるフラグを追加します。未処理の行のエントリのみを格納するそのフラグにインデックスを追加できます (したがって、小さくて高速になります)。この方法は、特に大量のデータの場合にはるかに効率的です。これは、ジョブを実行するたびに、大量のデータ チャンクを一度に効果的に処理できるためです。'Y'NULL

  3. Oracle Advanced Queueing を使用します。http://docs.oracle.com/cd/E11882_01/server.112/e11013/aq_intro.htm#ADQUE0100

(1) の場合、テーブル内のレコードごとに個別のジョブが作成されます。ジョブを作成する必要はありません。ただし、それらを監視する必要があります。失敗した場合は、調査して手動で再実行する必要があります。

(2) の場合は、1 つのジョブを作成して定期的に実行するだけです。1 つのレコードが失敗した場合、ジョブの次の繰り返しで取得できます。各レコードを個別のトランザクションで処理することで、1 つのレコードの障害がキューに残っている他のレコードの障害に影響を与えないようにします。

(3) の場合でも、(2) のようなジョブを作成しますが、テーブルを読み取る代わりに、キューからリクエストを取り出します。

于 2015-09-08T03:03:30.607 に答える