製品設計では、異なる種類のデータを保持するために、同様の署名を持つ個別のテーブルを使用します。
そのため、ロックなしで各テーブルで個別に並列に計算を実行できます。
計算コードを最適化して 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 つだけです。検索と公式ドキュメントは、関連する解決策を取りません。