2013-07-01 3 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

Создание задания не запускает его. Похоже, вы хотите ЦЕПЬ РАБОТЫ, где вы можете запускать много шагов (заданий) в определенном порядке (или одновременно). Я слишком занят, чтобы дать кучу кода, но см. [Здесь] (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, где вы разбиваете большую работу на куски на основе некоторых критериев и запускаете их по отдельности.

Смежные вопросы