В дизайне продукта используются отдельные таблицы с одинаковыми сигнатурами для хранения разных типов данных.
Таким образом, вы можете выполнять расчет на каждой таблице отдельно параллельно без блокировок.
Я оптимизирую код вычислений, чтобы он выполнялся в 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 в цикле — неэффективное решение, но это единственное, что приходит на ум. Поиск и официальная документация не дают подходящего решения.