- Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 17 anos, 5 meses atrás por
Marcio68Almeida.
-
AutorPosts
-
10 de setembro de 2008 às 5:02 pm #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
10 de setembro de 2008 às 10:48 pm #82704Marcio68Almeida
ParticipanteSe 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…10 de setembro de 2008 às 10:54 pm #82706Anô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
10 de setembro de 2008 às 11:17 pm #82707Marcio68Almeida
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…12 de setembro de 2008 às 3:14 am #82713LoadingXp
ParticipanteO 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 —
24 de setembro de 2008 às 6:25 pm #82883Ricardo Portilho Proni
ParticipanteA 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.
24 de setembro de 2008 às 6:33 pm #82886Marcio68Almeida
ParticipanteDê 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… 😀 -
AutorPosts
- Você deve fazer login para responder a este tópico.