Договорились о том, что ваше время убивает медленная обработка. Копирование 500 000 строк должно занимать считанные минуты.
Один подход INSERT ... SELECT FROM .... был бы лучшим, если у вас достаточно большие сегменты отката. База данных может даже автоматически применять параллельные методы к простому оператору SQL, который не будет применяться с PL / SQL.
Кроме того, вы можете взглянуть на подсказку / * + APPEND * / - прочитать ее и посмотреть, может ли это быть применимо к ситуации с вашей целевой таблицей.
o чтобы использовать все 10 ядер, вам понадобится либо использовать простой параллельный SQL, либо запустить 10 копий вашего блока pl / sql, разделив исходную таблицу на 10 копий.
В Oracle 10 это ручная задача (накатить собственный параллелизм), но Oracle 11.2 представляет DBMS_PARALLEL_EXECUTE.
Если это не удастся, следующим шагом будет увеличение объема выборки / вставки с использованием BULK COLLECT и групповой вставки - процесс в кусках по 1000 или более строк (или больше). Опять же посмотрите, может ли DBMS_PARALLEL_EXECUTE помочь вам, или вы могли бы отправить работу по частям через DBMS_JOB.
(Предостережение: у меня нет доступа ни к чему более позднему, чем Oracle 10)