Ola a todos,
Eu desenvolvi uma procedure que, basicamente pega os dados de uma tabela carregada pelo loader e insere os dados em uma outra. A diferença é que um mesmo registro dessa tabela pode gerar 1 ou 2 inserts na outra tabela com um campo alterado.
Na tabela de origem tem aproximadamente 2 milhoes de registros, o que então pode gerar de 2 a 4 milhoes de registros na tabela de destino.
A procedure começa muito rápida, processando pelo menos 10 mil registro por minuto. O problema é que a medida que o tempo vai passando ela vai diminuindo a performance inexplicavelmente e leva 30 horas pra rodar!!!! Se mantivesse o tempo de processamento era pra acabar em menos de 4 horas.
Após 2 horas de processo essa velocidade de 10 mil/minuto já cai pra 5 mil/minuto e após algumas horas de processo para 500/minuto.
Já tentei dropar todos os indices, foreign keys, checks, etc da tabela de destino e nada funciona.
Como as tabelas são grandes não tem como inserir tudo de uma vez, senão eu destruo a tablespace temporária do banco. Então montei um loop que processa os dados de 5 em 5 mil:
A lógica é:
– Monta um cursor
– Select /+*FIRST ROWS*/ (pega os primeiros 5 mil registros)
– Insere na tabela destino
– Se necessário insere novamente na tabela de destino com um flag alterado
-> Fica nesse loop até processar os 2 milhoes de registros
Alguém tem alguma idéia????? QUALQUER uma? hehehe
Estou já bem atrasado no meu projeto e não consigo desagarrar disso.
Muito obrigado,
Luiz Fernando Heidenreich Reis