Pular para o conteúdo
  • Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 18 anos, 6 meses atrás por Marcio68Almeida.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #76192
    luiz7s
    Participante

      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

      #76198
      Marcio68Almeida
      Participante

        Bom… 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… 😀

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.
      plugins premium WordPress