При использовании DBMS_PARALLEL_EXECUTE выяснилось, что DBMS_PARALLEL_EXECUTE.RUN_TASK не всегда запускает необходимое кол-во параллельных процессов.
Код запуска параллельных процессов:
При реальной эксплуатации на 3-x нодовом кластере с 48 ядрами, в среднем запускалось в параллельном режиме 12-14 процессов из 20 плановых, остальные запускались по мере окончания работы запущенных при старте. Но такой вариант работы не подходит, т.к. получаем псевдо-параллельное выполнение задач.
При использовании процедуры DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID данной проблемы не наблюдается, но она не всегда удобна в использовании.
Код запуска параллельных процессов:
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.
Комментариев нет:
Отправить комментарий