PL/SQLの非同期呼び出しの機能はありますか?コードのブロック内にいて、プロシージャを複数回呼び出して、プロシージャがいつ何を返すのか気にならないとしましょう。
BEGIN
myProc(1,100);
myProc(101,200);
myProc(201,300);
...
...
END;
上記の場合、コードがmyProc(1,100)が処理を完了するのを待ってから実行する必要はありません(101,200)
ありがとうございます。
DBMS_SCHEDULERとDBMS_JOBのアプローチの+1は、異なるアプローチを使用する必要があるかどうかも考慮してください。
行ごとに実行されるプロシージャがあり、遅いことがわかった場合、おそらくそのプロシージャを同時に複数回実行するのではなく、代わりにセットベースのアプローチを使用するようにします。極端な場合でも、並列クエリと並列DMLを使用して、プロセスの実時間を削減できます。
これは非常に一般的な障害であるため、これについて言及します。
次のようにDBMS_JOBで送信します。
declare
ln_dummy number;
begin
DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(1,100); end;');
DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(101,200); end;');
DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(201,300); end;');
COMMIT;
end;
ジョブを処理するスレッドを生成するには、job_queue_processesパラメータを0より大きく設定する必要があります。ビューuser_jobsを調べることにより、ジョブをクエリできます。
これはOracle 9iに適用されることに注意してください。10gのサポートは不明です。詳細はこちら こちら 。
編集:失われたCOMMITを追加しました
DBMS_SCHEDULERを調べてください。
完全性のために編集:
DMBS_SCHEDULERはOracle 10gで使用できます。これより前のバージョンでは、DBMS_JOBはほぼ同じジョブを実行します。
詳細については、次を参照してください: http://download.Oracle.com/docs/cd/B12037_01/server.101/b10739/jobtosched.htm
PL/SQL並列処理の場合、次のオプションがあります。
これらにより、PL/SQLでフォークとスレッドを「エミュレート」できます。もちろん、これらを使用すると、並列実行されたプロシージャ間で通信する必要性に気付くかもしれません。これを行うには、以下を確認してください。
個人的には、DBMS_Schedulerを使用して並列処理システムを実装し、「スレッド」間の通信にDBMS_Pipeを使用しました。 2つの組み合わせにとても満足しており、私の主な目標(特定の重量のある手順で主要な処理時間を短縮すること)が達成されました!
11g以降、別のオプションがあります。 Oracleは、DBMS_PARALLEL_EXECUTEという名前の、目的の操作に似たパッケージを導入しています。
彼らによれば、「DBMS_PARALLEL_EXECUTEパッケージを使用すると、ユーザーはテーブルデータを並行して増分更新できます」。使い方のかなり良い要約は here です。
基本的に、Oracleがジョブを細分化するために使用する方法を定義し(この場合、キー値を渡すように見える場合)、各部分を個別に開始します。それを使用するためには、確かに少し計画と少し余分なコーディングが必要ですが、とにかくやるべきではなかったことは何もありません。
このような認可された方法を使用する利点は、Oracleが各独立スレッドの監視に使用できるデータベースビューを提供することです。
並列(マルチスレッド)PL/SQLを実行する別の方法を次に示します。
http://www.williamrobertson.net/documents/parallel-plsql-launcher.html
Dbms_jobまたはdbms_schedularを使用する場合の欠点は、タスクがいつ終了するのか本当にわからないことです。私はあなたは気にしないでください、しかし多分あなたは将来あなたの考えを変えるでしょう。
編集:
この記事 http://www.devx.com/dbzone/10MinuteSolution/20902/0/page/1 は別の方法を説明しています。それは使用しています dbms_job
およびdbms_alert
。アラートは、ジョブが完了したことを通知するために使用されます(コールバック信号)。
ここでaskTomによってリストされている並列パイプラインアプローチは、より複雑なアプローチを提供しますが、DBMSジョブテクニックとは異なり、実際には作業が完了するまで一時停止します。とはいえ、あなたはdidに「非同期」手法を要求し、DBMS_JOBはそのために最適です。
ここでは、フラットファイルにデータをアンロードするさまざまな方法について説明します。方法の1つは、PL/SQLを使用して並列実行してスピードアップする方法を示しています。