Pular para o conteúdo
Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • #107390
    Avatar de TyttoTytto
    Participant

      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
      Avatar de Fábio PradoFábio Prado
      Participant

        @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

      Viewing 2 posts - 1 through 2 (of 2 total)
      • You must be logged in to reply to this topic.
      plugins premium WordPress