2

製品設計では、異なる種類のデータを保持するために、同様の署名を持つ個別のテーブルを使用します。

そのため、ロックなしで各テーブルで個別に並列に計算を実行できます。

計算コードを最適化して 7 倍高速に実行しますが、次の 10% のパフォーマンス向上には、コーディング/テストに 10 倍の時間が必要になると思います。

計算はすべてのテーブルで実行する必要があるため、論理的に並列に計算を行う必要があります (特にサーバーに 32 コアがある場合)。そのような目的のために、便利なDBMS_SCHEDULERパッケージを見つけました。

declare
  job1 clob := dbms_scheduler.generate_job_name('REPAYMENT_');
  job2 clob := dbms_scheduler.generate_job_name('REPAYMENT_');
begin
  dbms_scheduler.create_job(job_name => job1,
    job_type => 'PLSQL_BLOCK',
    job_action => 'begin calc_rep(30, DATE ''2012-01-01'', DATE ''2012-12-31''); end;',
    enabled => true,
    auto_drop => true);
  dbms_scheduler.create_job(job_name => job2,
    job_type => 'PLSQL_BLOCK',
    job_action => 'begin calc_rep(31, DATE ''2012-01-01'', DATE ''2012-12-31''); end;',
    enabled => true,
    auto_drop => true);
  dbms_output.put_line('jobs was finished');
end;
/

しかし、ジョブが終了する前にジョブが終了するのを待つ方法がわかりません...

ループで定期的にscheduler_jobsをポーリングすることは非効率的な解決策ですが、頭に浮かぶのは 1 つだけです。検索と公式ドキュメントは、関連する解決策を取りません。

4

1 に答える 1

1

ジョブは並列処理には使用されません (少なくともそれは目的ではありません)。ジョブは、特定の時刻に特定のスケジュールでプロシージャを呼び出すために使用されます。そのため、ジョブを開始して終了するのを待つ必要はありません。

とにかく、あなたがしたことはジョブを作成することですが、それらを呼び出して実行を開始することはありません。あなたはそれを行うために電話dbms_scheduler.run_job( job_name => job1 )する必要があります. その呼び出しはすぐに返され、実行時間の長いジョブは引き続きバックグラウンドで実行されます。

私があなたの質問を正しく理解していれば、あなたがやろうとしているのは、複雑な計算を分割して並行して実行することですが、必ずしもスケジュールに従って繰り返し実行するとは限りません。必要なのはDBMS_PARALLEL_EXECUTE です。ここでは、大きなジョブをいくつかの基準に基づいてチャンクに分割し、それらを個別に実行します。

于 2013-07-24T04:06:28.810 に答える