2013-07-01 57 views
2

产品设计使用具有相似签名的单独表格来保存不同类型的数据。等待完成几个DBMS_SCHEDULER.CREATE_JOB

因此,您可以在不锁定的情况下单独并行执行每个表上的计算。

我优化了计算代码,使其运行速度提高了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

创建工作不会启动它。听起来像你想要一个工作链,在那里你可以按特定的顺序(或同时)运行多个步骤(作业)。我忙于atm来给出一堆代码,但请参阅[here](http://www.oracle-base.com/articles/10g/scheduler-enhancements-10gr2.php#job_chains),例如 – tbone

+0

@ tbone感谢兴趣+1 – gavenkoa

回答

1

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

无论如何,你所做的是创建工作,但从不调用它们开始运行。你必须拨打dbms_scheduler.run_job(job_name => job1)来做到这一点。该呼叫将立即返回,您的长期工作将继续在后台运行。

如果我正确理解你的问题,你想要做的是分解一些复杂的计算并且并行运行它,但不一定按计划重复运行它。你想要的是DBMS_PARALLEL_EXECUTE,你根据一些标准将一个大型工作分成几块,然后单独运行。