› Fóruns › SQL e PL/SQL › Procedure que começa rápido e cai demais a performance
- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 19 anos, 9 meses atrás por
Marcio68Almeida.
-
AutorPosts
-
14 de agosto de 2006 às 9:07 pm #76192
luiz7s
ParticipanteOla 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 Reis14 de agosto de 2006 às 10:14 pm #76198Marcio68Almeida
ParticipanteBom… teria que fazer uma análise mais detalhada do processo como um todo…
Mas, a princípio, eu verificaria duas coisinhas : Memória e Disco. Pos são os grandes vilões da performace…
Se o seu processo vai alocando cada vez mais memória, vai chegar a hora que ele vai começar a fazer swap, se isso estiver acontecendo você vai ter um freio de mão puxado ai… verifique se o seu processo está colocando tudo em memória sem libera-la..
Outra coisa é o disco, se a tabela gera redo log (archives), se há muitos índices (você disse que tirou) se está muito fragmentada (é bom mover a tabela para desfragmenta-la), verifique também a área de undo e temporária…
Já tem algo para avaliar… 😀 -
AutorPosts
- Você deve fazer login para responder a este tópico.
› Fóruns › SQL e PL/SQL › Procedure que começa rápido e cai demais a performance