DELETE - Grande quantidade de registros

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
Responder
ricardocmoreno
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 51
Registrado em: Qua, 12 Mar 2008 2:11 am
Localização: São Bernardo - SP
Ricardo Moreno
DBA Oracle Pleno

“Só sei que nada sei, e o fato de saber isso, me coloca em vantagem sobre aqueles que acham que sabem alguma coisa.”
(Sócrates 470 a.C – 399 a.C)

Informações do Ambiente:
* Versão do Oracle: 10.2.0.3
* Sistema Operacional: Red Hat PPC 64


Senhores,

Bom Dia,

Estou precisando fazer um expurgo em uma tabela que tem 696.276.322 linhas.
A minha instância funciona 24x7x365
E a tabela que contem os dados que preciso fazer o expurgo é muito acessada em qualquer horário.

Preciso fazer o expurgo de +/- 10.000.000 de linhas.
Já tentei fazer com um delete simples com um filtro por um range de data que preciso apagar. Mas estava demorando muito, alem de lockar a tabela em alguns momentos. fora a geração de archive que aumentou consideravelmente.
E após os deletes eu teria que executar algum DBMS para devolver o espaço deletado ao disco, já que o delete não devolve o espaço ao disco, apenas apaga os registros o que acorreria o inverso no caso de um truncate.

Minha dúvida: Existe uma maneira mais eficiente e mais rápida para fazer esse expurgo ?
Alguma dica ? sugestão ?

Obrigado.
gilbertoca
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 372
Registrado em: Ter, 24 Jan 2006 3:33 pm
Localização: Palmas - TO
Contato:

ricardocmoreno escreveu:Informações do Ambiente:
* Versão do Oracle: 10.2.0.3
* Sistema Operacional: Red Hat PPC 64


Senhores,

Bom Dia,

Estou precisando fazer um expurgo em uma tabela que tem 696.276.322 linhas.
A minha instância funciona 24x7x365
E a tabela que contem os dados que preciso fazer o expurgo é muito acessada em qualquer horário.

Preciso fazer o expurgo de +/- 10.000.000 de linhas.
Já tentei fazer com um delete simples com um filtro por um range de data que preciso apagar. Mas estava demorando muito, alem de lockar a tabela em alguns momentos. fora a geração de archive que aumentou consideravelmente.
E após os deletes eu teria que executar algum DBMS para devolver o espaço deletado ao disco, já que o delete não devolve o espaço ao disco, apenas apaga os registros o que acorreria o inverso no caso de um truncate.

Minha dúvida: Existe uma maneira mais eficiente e mais rápida para fazer esse expurgo ?
Alguma dica ? sugestão ?

Obrigado.
Exitem restrições nesse objeto? (trigger/plsql/constraints)
Você pode habilitar, efetuar a operação e depois reabilitar novamente.

Você tem a opção WITH READ ONLY.

Você pode usar a cláusula ROWNUM no seu filtro e deletar aos poucos.

A galera do PL/SQl pode ajudar aqui tb, existem técnicas de tuning nessa área.

Outra alternativa é criar um objeto igual filtrando as linhas necessárias, trunca o antigo e crie um sinômimo para o novo (acho que podemos renomear, não sei ao certo!)

Selecionar tudo

1. Crie uma nova tabela
create table <newTable> as select * from <oldTable> where ...
2. Truncar e Deletar a antiga
truncate oldtable --sem necessidade de segmento de rollback
drop oldtable
3. Renomeie
rename <newTable> para <oldTable>
4. Crie índices necessários
create the index.
Gilberto
ricardocmoreno
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 51
Registrado em: Qua, 12 Mar 2008 2:11 am
Localização: São Bernardo - SP
Ricardo Moreno
DBA Oracle Pleno

“Só sei que nada sei, e o fato de saber isso, me coloca em vantagem sobre aqueles que acham que sabem alguma coisa.”
(Sócrates 470 a.C – 399 a.C)

Abri um Service Request junto a Oracle pedindo uma sujestão e segue a resposta.

Selecionar tudo

Please see the action plan below.

Thanks,
Hazem Ibrahim
Global Customer Services

ACTION PLAN
===========
The following options can be used to delete a large number of records from a table:

1) The ideal solution is to convert the table from non-partitioned to a partitioned table by day (or by week, by month - for
period which you want delete/drop), and instead of delete rows, you can drop
the old partition which you don't want to keep. You can drop or place its
tablespace in offline mode, By this you keep data, without any access. This can
be done *online* using DBMS_Redefinition package.

please refer to the following:
Note 472449.1 - How To Partition Existing Table Using DBMS_Redefinition
Note 177407.1 - How to Re-Organize a Table Online

Oracle® Database Administrator's Guide
10g Release 2 (10.2)
Part Number B14231-02
15 Managing Tables
Example 1 Redefines a table by adding new columns and adding partitioning
http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/tables.htm#CJAEBFJA

2) You can break the delete operation to many by deleting a certain number of rows each time:
Ex:
SQL> delete from big_table
where <condition>
and rownum < 10000;

** The above will delete 10000 rows at a time

3) You can export/import
a) Export the table with query option
b) Truncate the table
c) Import the table back

However this operation has a higher risk and will not allow access to the table for some
time
Irei fazer a primeira opção.

[]s
gilbertoca
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 372
Registrado em: Ter, 24 Jan 2006 3:33 pm
Localização: Palmas - TO
Contato:

ricardocmoreno escreveu:
1) The ideal solution is to convert the table from non-partitioned to a partitioned table by day (or by week, by month - for
period which you want delete/drop), and instead of delete rows, you can drop
the old partition which you don't want to keep. You can drop or place its
tablespace in offline mode, By this you keep data, without any access. This can
be done *online* using DBMS_Redefinition package.


[]s
Bom, você não deixou claro que tinha esse opcional (o qual só existe na versão enterprise).
Por isso lhe passei o mais usual nesses casos!
De qualquer forma, poste aqui os procedimentos que você adotou (Claro, se não infrigir alguma norma de sua empresa!), para que possamos ter como referência.

Gilberto
ricardocmoreno
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 51
Registrado em: Qua, 12 Mar 2008 2:11 am
Localização: São Bernardo - SP
Ricardo Moreno
DBA Oracle Pleno

“Só sei que nada sei, e o fato de saber isso, me coloca em vantagem sobre aqueles que acham que sabem alguma coisa.”
(Sócrates 470 a.C – 399 a.C)

firmeza...

Estou fazendo os procedimento já a dois dias pois a tabela é muito grande.
Mesmo trabalhando em parallel ainda demora um pouco...
Assim que obtiver os resultado postarei aqui para o pessoal..

abçs
alexmaior
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Dom, 03 Mai 2009 7:25 pm
Localização: Botucatu - SP
Alex Maior

Olá Ricardo tudo bem,

Você poderia postar um example da solução que você executou.

Grato

Alex Oliveira
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes