Translate

четверг, 23 июля 2015 г.

Тонкость в использовании DBMS_PARALLEL_EXECUTE.RUN_TASK

При использовании DBMS_PARALLEL_EXECUTE выяснилось, что DBMS_PARALLEL_EXECUTE.RUN_TASK не всегда запускает необходимое кол-во параллельных процессов.
Код запуска параллельных процессов:
DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_SQL
( task_name   => 'TASK_PJOB',
sql_stmt    => 'SELECT level start_id, level end_id FROM dual connect by level <= '||v_count_string,
by_rowid    => FALSE
);

DBMS_PARALLEL_EXECUTE.RUN_TASK
( task_name      => 'TASK_PJOB',
sql_stmt       => 'BEGIN PKG_PJOB.P_PJOB(:start_id, :end_id); END;',
language_flag  => DBMS_SQL.NATIVE,
parallel_level => v_parallel_level
);

При использования данного примера, первоначально переменная v_count_string была равна v_parallel_level.
При реальной эксплуатации на 3-x нодовом кластере с 48 ядрами, в среднем запускалось в параллельном режиме 12-14 процессов из 20 плановых, остальные запускались по мере окончания работы запущенных при старте. Но такой вариант работы не подходит, т.к. получаем псевдо-параллельное выполнение задач.
При использовании процедуры DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID данной проблемы не наблюдается, но она не всегда удобна в использовании.
В ходе тестирования выяснилось, что если  переменная v_parallel_level (100) больше v_count_string (20) в 5 раз, то всегда запускается 20 параллельных процессов.
Поэтому при использовании DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_SQL об этом эффекте нужно помнить.
Проверялось на Oracle 11.2.0.4.0.

Комментариев нет:

Отправить комментарий