产品设计使用具有相似签名的单独表格来保存不同类型的数据。
因此,你可以在没有锁的情况下分别并行地对每个表进行计算。
我优化了计算代码,因此运行速度提高了7倍,但接下来10%的性能提升我认为需要x10更多时间进行编码/测试。
必须对所有表执行计算,以便逻辑上并行计算(特别是当服务器有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 是一种效率低下的解决方案,但它只是一个想到的问题。搜索和官方文档没有任何相关的解决方案。
答案 0 :(得分:1)
作业并不用于并行(至少那不是他们的)。作业用于在特定时间和特定时间表上调用过程。所以你不要开始工作并等待它完成。
无论如何,你所做的是创造工作,但从不调用它们开始运行。您必须致电dbms_scheduler.run_job( job_name => job1 )
来执行此操作。该调用将立即返回,您的长期工作将继续在后台运行。
如果我正确理解你的问题,你要做的就是打破一些复杂的计算并并行运行,但不一定按计划重复运行。您想要的是DBMS_PARALLEL_EXECUTE,您可以根据某些条件将大型工作分成几个块并单独运行。