2

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

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

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

4

1 回答 1

1

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

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

如果我正确理解您的问题,那么您要做的是分解一些复杂的计算并并行运行,但不一定按计划重复运行。您想要的是DBMS_PARALLEL_EXECUTE,您可以在其中根据某些标准将大型作业分成块并单独运行。

于 2013-07-24T04:06:28.810 回答