web-dev-qa-db-ja.com

PL / SQLでスレッドを使用できますか?

PL/SQLの非同期呼び出しの機能はありますか?コードのブロック内にいて、プロシージャを複数回呼び出して、プロシージャがいつ何を返すのか気にならないとしましょう。

BEGIN
  myProc(1,100);
  myProc(101,200);
  myProc(201,300);
  ...
  ...

END;

上記の場合、コードがmyProc(1,100)が処理を完了するのを待ってから実行する必要はありません(101,200)
ありがとうございます。

24
Burhan

DBMS_SCHEDULERとDBMS_JOBのアプローチの+1は、異なるアプローチを使用する必要があるかどうかも考慮してください。

行ごとに実行されるプロシージャがあり、遅いことがわかった場合、おそらくそのプロシージャを同時に複数回実行するのではなく、代わりにセットベースのアプローチを使用するようにします。極端な場合でも、並列クエリと並列DMLを使用して、プロセスの実時間を削減できます。

これは非常に一般的な障害であるため、これについて言及します。

24
David Aldridge

次のように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を追加しました

17
darreljnz

DBMS_SCHEDULERを調べてください。

完全性のために編集:

DMBS_SCHEDULERはOracle 10gで使用できます。これより前のバージョンでは、DBMS_JOBはほぼ同じジョブを実行します。

詳細については、次を参照してください: http://download.Oracle.com/docs/cd/B12037_01/server.101/b10739/jobtosched.htm

11
Matthew Farwell

PL/SQL並列処理の場合、次のオプションがあります。

これらにより、PL/SQLでフォークとスレッドを「エミュレート」できます。もちろん、これらを使用すると、並列実行されたプロシージャ間で通信する必要性に気付くかもしれません。これを行うには、以下を確認してください。

個人的には、DBMS_Schedulerを使用して並列処理システムを実装し、「スレッド」間の通信にDBMS_Pipeを使用しました。 2つの組み合わせにとても満足しており、私の主な目標(特定の重量のある手順で主要な処理時間を短縮すること)が達成されました!

10
frohiky

11g以降、別のオプションがあります。 Oracleは、DBMS_PARALLEL_EXECUTEという名前の、目的の操作に似たパッケージを導入しています。

彼らによれば、「DBMS_PARALLEL_EXECUTEパッケージを使用すると、ユーザーはテーブルデータを並行して増分更新できます」。使い方のかなり良い要約は here です。

基本的に、Oracleがジョブを細分化するために使用する方法を定義し(この場合、キー値を渡すように見える場合)、各部分を個別に開始します。それを使用するためには、確かに少し計画と少し余分なコーディングが必要ですが、とにかくやるべきではなかったことは何もありません。

このような認可された方法を使用する利点は、Oracleが各独立スレッドの監視に使用できるデータベースビューを提供することです。

6
Dwayne King

並列(マルチスレッド)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。アラートは、ジョブが完了したことを通知するために使用されます(コールバック信号)。

5
tuinstoel

ここでaskTomによってリストされている並列パイプラインアプローチは、より複雑なアプローチを提供しますが、DBMSジョブテクニックとは異なり、実際には作業が完了するまで一時停止します。とはいえ、あなたはdidに「非同期」手法を要求し、DBMS_JOBはそのために最適です。

1
Ranzo Taylor

ここでは、フラットファイルにデータをアンロードするさまざまな方法について説明します。方法の1つは、PL/SQLを使用して並列実行してスピードアップする方法を示しています。

http://www.Oracle-developer.net/display.php?id=425

1
tuinstoel