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


person gavenkoa    schedule 01.07.2013    source источник
comment
создание задания не запускает его. Похоже, вам нужна ЦЕПОЧКА ЗАДАНИЙ, где вы можете выполнять множество шагов (задания) в определенном порядке (или одновременно). Я слишком занят банкоматом, чтобы дать кучу кода, но см. здесь для примера   -  person tbone    schedule 01.07.2013
comment
@tbone спасибо за интерес +1   -  person gavenkoa    schedule 02.07.2013


Ответы (1)


Задания не используются для параллелизма (по крайней мере, они не для этого для). Задания используются для вызова процедуры в определенное время и по определенному расписанию. Таким образом, вы не начинаете работу и ждете, пока она закончится.

В любом случае, вы создали задание, но никогда не вызывали его для запуска. Для этого вам нужно позвонить dbms_scheduler.run_job( job_name => job1 ). Этот вызов будет немедленно возвращен, и ваша длительная работа будет продолжать выполняться в фоновом режиме.

Если я правильно понимаю ваш вопрос, вы пытаетесь разбить какой-то сложный расчет и запустить его параллельно, но не обязательно запускать его повторно по расписанию. Вам нужно DBMS_PARALLEL_EXECUTE, где вы разбиваете большой задание на куски на основе некоторых критериев и запускать их по отдельности.

person eaolson    schedule 24.07.2013