Pular para o conteúdo
  • Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 10 anos, 3 meses atrás por Fábio Prado.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #107390
    Tytto
    Participante

      Preciso atualizar os dados para corrigir a integridade dos registros.

      Tenho as seguintes tabelas:

      GLTEFDAD com 23 milhões de registros , com índices não-únicos no “id_conteudo” e “id_tef + dado”

      – GLTEFCON com 20 milhões de registros, com índice único no “id_conteudo” e indice não-único no “conteúdo”

      O comando sql que FUNCIONA perfeitamente, mas dá um custo de 345.028, o que vai demorar vários dias para rodar:

      —————————————–

      declare

      Vcontador number;

      CURSOR c_tef is
      SELECT ID_TEF
      FROM GLTEFDAD
      GROUP BY ID_TEF;

      Cursor Vdados is
      select
      a.id_tef,
      a.dado,
      (SELECT MIN (c.id_conteudo) FROM GLTEFCON c WHERE c.id_conteudo < a.id_conteudo AND exists (SELECT 1 FROM GLTEFCON b WHERE b.id_conteudo = a.id_conteudo and c.conteudo = b.conteudo)) id_conteudo from GLTEFDAD a WHERE EXISTS (SELECT 1 FROM GLTEFCON c WHERE c.id_conteudo < a.id_conteudo AND exists (SELECT 1 FROM GLTEFCON b WHERE b.id_conteudo = a.id_conteudo and c.conteudo = b.conteudo)); BEGIN Vcontador := 0; dbms_output.put_line('Vai começar'); For Ve in Vdados Loop update GLTEFDAD set id_conteudo = ve.id_conteudo where id_tef = ve.id_tef and dado = ve.dado; Vcontador := Vcontador +1; if Vcontador > 1000 then
      dbms_output.put_line(‘Comitou mais 1000’);
      Commit;
      Vcontador := 0;
      end if;

      End Loop;

      COMMIT;
      dbms_output.put_line(‘Terminou’);

      END;

      —————————————–

      Alguém tem uma dica de como melhorar o custo dessa atualização de dados?
      Lembrando que é uma rotina para ajustar a integridade dos dados, e nesse caso toda a tabela precisa ser verificada.

      Desde já agradeço a ajuda.

      #107456
      Fábio Prado
      Participante

        @Tytto,

        Uma boa dica para otimizar instruções SQL é tentar, de um modo geral, resolver o seu problema com SQL puro, ou seja, não utilize PL/SQL neste seu UPDATE. Ao invés de montar um cursor para ler linha a linha os dados de origem, faça um UPDATE com uma subquery correlacionada como nos exemplos do link http://glufke.net/oracle/viewtopic.php?t=7008.

        Outra coisa que você poderia testar é dropar os índices antes do UPDATE e recriá-los depois. O tempo costuma melhorar se vc não precisar destes índices no SELECT da subquery correlacionada.

        []s

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