PL-SQL paralleling execution 10g

Как рассчитать больший объем данных за то же время ?   Увеличить скорость расчета ?   Как заставить PL-SQL  задействовать все свободные процессорные мощности ? .   Для всех этих вопросов есть только один ответ – нужно использовать возможности параллельного исполнения . Для этого есть несколько  возможностей – в запросах на выборку данных (select)  использовать подсказки оптимизатору(hint) для распараллеливания запроса (/*+ FULL(hr_emp) PARALLEL(hr_emp, DEFAULT,DEFAULT) */).

Второй способ, это параллелить исполнение PL_SQL программы из внешнего вызова, средствами операционной системы.  Тогда алгоритм работы чуть усложняется –  вначале вызываем несколько потоков для расчета единого результата, затем забираем рассчитанные  данные.

Третий способ (10g), когда требуется выполнять задачу едино за один шаг  –    это использование менеджера заданий (DBMS_SCHEDULER.CREATE_JOB) для одновременного запуска нескольких расчетов.  По сравнению с предыдущим способом, данный инструмент имеет следующие преимущества

(Для 11-ой версии нужно использовать DBMS_PARALLEL_EXECUTE.)

1)      «Клиент» ничего не должен знать о реализованном параллелизме

2)      Данные возвращаются по мере расчета, а не скопом в конце процедуры

Об этом и пойдет речь далее (..в продолжении темы PL-SQL расчетов в Essbase).

Преамбула , требуется рассчитать группу компаний (несколько юр. лиц )  по единому алгоритму (run_execution (LE)) .

Для того что бы данная задача решалась в реальном (параллельном) мире нужно   решить несколько сопутствующих задач

1)      Управление заданиями

  1. Создание задания
  2. Завершение

2)      Работа с промежуточными данными

  1. Сохранить результат расчета потока во временной таблице
  2. Сообщить основному потоку о завершении расчета
  3. Удалить устаревшие данные

3)      Управление потоками

  1. Создание  N веток заданий
  2. Вывод рассчитанных данных
  3. Завершение  выполнения

Для управления заданиями используется таблица(XX_SRV_JOB_POOL) с тремя полями (номер основного потока (seq), номер исполняемого потока(job), результат расчета (JobResult)). Соответственно поле JobResult принимает значения равные этапу исполнения задания и в конце работы равняется номеру исполняемого потока, в случае возникновения ошибки исполнения – это поле принимает отрицательно значение кода SQL ошибки.

.

Для управления потоками используется следующая логика. Для каждой единицы расчета создается задание , пока не превысится количество допустимых потоков, затем система одновременно ждет и выводит результаты расчетов и запускает следующие задания пока не просмотрит весь список заданий.