[英]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.