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 ошибки.

.

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

  • u041bu0435u043eu043du0438u0434 u0411u043eu0440u0447u0443u043a

    u0415u0441u0442u044c u0436u0435 DBMS_PARALLEL_EXECUTE, u0437u0430u0447u0435u043c u0438u0437u043eu0431u0440u0435u0442u0430u0442u044c u0432u0435u043bu043eu0441u0438u043fu0435u0434? nnhttp://www.oracle.com/technetwork/issue-archive/o30plsql-086044.html

    • u0410u0433u0430 , u0432u0435u043bu043eu0441u0438u043fu0435u0434( u041bu0435u043eu043du0438u0434, u0435u0441u043bu0438 u0447u0435u0441u0442u043du043e u043fu0440u043e u044du0442u0443 u043cu043eu0434u043du0443u044e u0444u0438u0447u0443 u0441u043bu044bu0448u0443 u0432u043fu0435u0440u0432u044bu0435 u043eu0442 u0442u0435u0431u044f …n 1) u041fu043eu0434u043eu0437u0440u0435u0432u0430u044e u0447u0442u043e u043du0430 10g u0435u0435 u043du0435u0442. n 2) u042du0442u043e u043du0435 u043fu0440u043eu0441u0442u043e u0432u0435u043bu0438u043a u0430 u0432u0435u043bu0438u043a u0441 u043au0435u0448u0438u0440u043eu0432u0430u043du0438u0435u043c, u0442u0438u043fu0430 u0434u043eu043f. u0444u0443u043du043au0446u0438u043eu043du0430u043bu044cu043du043eu0441u0442u044c. )

      • u041bu0435u043eu043du0438u0434 u0411u043eu0440u0447u0443u043a

        u0422u043eu0447u043du043e, u0432 10-u043au0435 u044du0442u043eu0433u043e u043du0435 u0431u044bu043bu043e. :)nnu0412u043eu043eu0431u0449u0435 u0441u0430u043c u043fu043eu0434u0445u043eu0434, u043au043eu043du0435u0447u043du043e, u043du0435u043fu0440u0430u0432u0438u043bu044cu043du044bu0439. u041eu0431 u044du0442u043eu043c u043eu0447u0435u043du044c u0443u0434u0430u0447u043du043e u0432u044bu0440u0430u0437u0438u043bu0441u044f tkyte – row-by-row slow-by-slow, http://tkyte.blogspot.ru/2006/10/slow-by-slow.htmlnnnu0422.u0435. u043eu0447u0435u043du044c u0447u0430u0441u0442u043e, u043au043eu0433u0434u0430 u0432u043eu0437u043du0438u043au0430u0435u0442 u043fu043eu0434u043eu0431u043du043eu0433u043e u0440u043eu0434u0430 u0437u0430u0434u0430u0447u0430, u043fu0440u043eu0431u043bu0435u043cu0430 u0432 u0430u0440u0445u0438u0442u0435u043au0442u0443u0440u0435, u0438 u0437u0434u0435u0441u044c u0441u0430u043cu043eu0435 u044du0444u0444u0435u043au0442u0438u0432u043du043eu0435 – u043du0435 u043cu0430u0441u0448u0442u0430u0431u0438u0440u043eu0432u0430u0442u044c, u0430 u043fu0435u0440u0435u043fu0438u0441u044bu0432u0430u0442u044c. u041a u0441u043eu0436u0430u043bu0435u043du0438u044e, u044du0442u043e u0432u043eu0437u043cu043eu0436u043du043e u043du0435 u0432u0441u0435u0433u0434u0430. u041eu0441u0442u0430u0451u0442u0441u044f u0432u044bu043fu043eu043bu043du044fu0442u044c u0440u0435u0441u0443u0440u0441u043eu0451u043cu043au0438u0435 u043eu043fu0435u0440u0430u0446u0438u0438 u043fu0430u0440u0430u043bu043bu0435u043bu044cu043du043e.

  • Pingback: Oracle Hyperion Performance Lab » PL-SQL vs EssBase Calculation()