等待完成几个DBMS_SCHEDULER.CREATE_JOB

时间:2013-07-01 15:42:41

标签: oracle plsql parallel-processing synchronization

产品设计使用具有相似签名的单独表格来保存不同类型的数据。

因此,你可以在没有锁的情况下分别并行地对每个表进行计算。

我优化了计算代码,因此运行速度提高了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 是一种效率低下的解决方案,但它只是一个想到的问题。搜索和官方文档没有任何相关的解决方案。

1 个答案:

答案 0 :(得分:1)

作业并不用于并行(至少那不是他们)。作业用于在特定时间和特定时间表上调用过程。所以你不要开始工作并等待它完成。

无论如何,你所做的是创造工作,但从不调用它们开始运行。您必须致电dbms_scheduler.run_job( job_name => job1 )来执行此操作。该调用将立即返回,您的长期工作将继续在后台运行。

如果我正确理解你的问题,你要做的就是打破一些复杂的计算并并行运行,但不一定按计划重复运行。您想要的是DBMS_PARALLEL_EXECUTE,您可以根据某些条件将大型工作分成几个块并单独运行。