繁体   English   中英

等待几个DBMS_SCHEDULER.CREATE_JOB完成

[英]Waiting for completion of several DBMS_SCHEDULER.CREATE_JOB

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

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

我优化了计算代码,使其运行速度提高了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是一种低效的解决方案,但它只是一个考虑在内。 搜索和官方文档没有任何相关的解决方案。

Job不用于并行处理(至少这不是它们的用途 )。 作业用于在特定时间和特定时间表上调用过程。 因此,您无需开始工作并等待其完成。

无论如何,您要做的是创建作业,但永远不要调用它们以开始运行。 您必须调用dbms_scheduler.run_job( job_name => job1 )来执行此操作。 该调用将立即返回,并且您长期运行的作业将继续在后台运行。

如果我正确理解了您的问题,那么您要做的是分解一些复杂的计算并并行运行,但不一定要按计划重复运行。 您需要的是DBMS_PARALLEL_EXECUTE ,您可以在其中根据一些条件将大型作业分解为多个块,然后分别运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM