Pular para o conteúdo
  • Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 17 anos, 5 meses atrás por Marcio68Almeida.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #82703
    Anônimo

      Olá, bom dia.

      Trabalho com implementações de DW e frequentemente preciso utilizar delete para limpar registros de determinadas tabelas em caso de reprocessamento de dados já existentes.

      Geralmente estás tabelas tem um volume grande de dados, e o delete costuma ver muito oneroso para a carga.

      Geralmente, eu costumo criar um indice contendo os campos envolvidos na clausula where do delete.

      Existe alguma outra boa prática que posso utilizar para otimizar os deletes?

      Obrigado

      Thiago

      #82704
      Marcio68Almeida
      Participante

        Se for uma massa de dados MUITO grande, talvez fosse interessante remover os índices (normalmente existem vários), deixar só o que o delete vai utilizar e depois recriar os índices, pois cada linha removida implica em atualização de todos os índices…
        Outra opção é mover os dados para uma tabela temporária, zerar a tabela que está sendo manipulada e restituir os dados à tabela…
        Não há muito o que fazer com grandes volumes de dados…

        #82706
        Anônimo

          Fala Márcio, beleza?

          Eu li uns artigos sobre o uso da tabela TMP, estou analisando se se encaixa na solução do meu problema.

          Estou com um outro problema aqui, a query não esta saindo pelo indice, ele esta fazendo um full na tabela, isso poderia acontecer por que tenho mais de um indíce criado para a tabela?

          Abraço

          Rani

          #82707
          Marcio68Almeida
          Participante

            [quote=”Rani”:2qm9pm53]Estou com um outro problema aqui, a query não esta saindo pelo indice, ele esta fazendo um full na tabela, isso poderia acontecer por que tenho mais de um indíce criado para a tabela?
            [/quote]
            Se o percentual de linhas envolvidas no evento for grande (não sei quanto), o Oracle pode decidir fazer um full na tabela e despresar o índice, mesmo com hint…

            #82713
            LoadingXp
            Participante

              O problema não encontra-se no Plano de Execução do Oracle, ou seja, se está ou nao fazendo Table Scan ou fazendo ou não um Index Range.

              Voce deve verificar se o CONTEUDO que vai ser excluido e verificar se a quantidade de registros ultrapassa o valor de 1/4 da tabela!

              Seria interessante entender o processo (regra de negocio) para saber se compesa eliminar os indices, ou até mesmo selecionar os registros que irão ficar na tabela e criar uma nova tabela, truncar a anterior e fazer o RENAME.

              Atualize as estátisticas da tabela e envie mais informações.

              — Luciano Alvarenga Maciel Pires —

              #82883
              Ricardo Portilho Proni
              Participante

                A forma mais rapida de se fazer um DELETE gigantesco, eh nao faze-lo.
                Faca um CTAS.

                Por exemplo, para apagar todas as linhas da tabela TESTE que tem a coluna IND_OK = ‘Nao’:

                CREATE TABLE TESTE_2 AS SELECT * FROM TESTE WHERE IND_OK != ‘Nao’;
                DROP TABLE TESTE;
                ALTER TABLE TESTE2 RENAME TO TESTE;

                Depois, o chato eh recriar indices e constraints, mas vc ira se espantar com a velocidade.

                #82886
                Marcio68Almeida
                Participante

                  Dê uma olhada no PARALLEL QUERY, é uma opção interessante para sua situação…

                  Ricardo…
                  Essa opção de criar uma outra tabela depois renomear e recriar os índices eu havia dito logo na primeira resposta… 😀

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