产品设计使用具有相似签名的单独表格来保存不同类型的数据。
因此,您可以在没有锁的情况下并行分别对每个表执行计算。
我优化了计算代码,使其运行速度提高了 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是一种低效的解决方案,但它只是一个想到的解决方案。搜索和官方文档不采取任何相关的解决方案。