É muito melhor inserir algumas centenas de linhas de cada vez, usando tabelas PL/SQL e FORALL para vincular à instrução insert. Para obter detalhes sobre isso, consulte aqui .
Também tenha cuidado com a forma como você constrói as tabelas PL/SQL. Se possível, prefira fazer todas as suas transformações diretamente no SQL usando "INSERT INTO t1 SELECT ...", pois fazer operações linha por linha no PL/SQL ainda será mais lento que o SQL.
Em ambos os casos, você também pode usar inserções de caminho direto usando
INSERT /*+APPEND*/
, que basicamente ignora o cache do banco de dados e aloca e grava diretamente novos blocos em arquivos de dados. Isso também pode reduzir a quantidade de log, dependendo de como você o usa. Isso também tem algumas implicações, portanto, leia o bom manual
primeiro. Finalmente, se você estiver truncando e reconstruindo a tabela, pode valer a pena primeiro descartar (ou marcar como inutilizável) e depois reconstruir os índices.