Функция Forall Insert или Insert Select Pipeline - PullRequest
0 голосов
/ 06 мая 2020

Я разработчик Pl Sql и выполняю процесс ETL, преобразую полученные данные и вставляю их в другую таблицу. Итак, я изучаю, можно ли изменить мою «вставку для всех» на «вставить выберите конвейерную».

Это изменение производительности, если да, то почему? Я обрабатываю таблицы кратных чисел, превышающие 200 млн строк.

OPEN cursorData;
LOOP
Fetch cursorData BULCK COLLECT INTO rawTable LIMIT blockLimit;
ProcessRawData(tbData, tbReferences);
FORALL i IN 1..tbReferences.COUNT LOOP
INSERT INTO goal_schema.references VALUES tbReferences(i);
END LOOP;
FORALL i IN 1..tbReferences.COUNT LOOP
INSERT INTO goal_schema.table VALUES tbReferences(i);
END LOOP;
EXIT WHEN cursorData%NOTFOUND;
END LOOP;

Я sh изменю его для этого кода, если можно выполнить процесс.

OPEN cursorData;
LOOP
Fetch cursorData BULCK COLLECT INTO rawTable LIMIT blockLimit;
ProcessRawData(tbData, tbReferences);

INSERT /*+ Pallarel */ INTO goal_schema.references SELECT * FROM Table(pipeFuncGetReferences());

INSERT /*+ Pallarel */ INTO goal_schema.table SELECT * FROM Table(pipeFuncGetData());

EXIT WHEN cursorData%NOTFOUND;
END LOOP;

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

Примечание: мы используем шаблоны для процесса, тогда это повлияет на все пакеты.

...