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.
DELETE - Grande quantidade de registros
-
- 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)
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)
-
- Rank: DBA Sênior
- Mensagens: 372
- Registrado em: Ter, 24 Jan 2006 3:33 pm
- Localização: Palmas - TO
- Contato:
Exitem restrições nesse objeto? (trigger/plsql/constraints)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.
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!)
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.
-
- 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)
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.
Irei fazer a primeira opção.
[]s
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
[]s
-
- Rank: DBA Sênior
- Mensagens: 372
- Registrado em: Ter, 24 Jan 2006 3:33 pm
- Localização: Palmas - TO
- Contato:
Bom, você não deixou claro que tinha esse opcional (o qual só existe na versão enterprise).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
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
-
- 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)
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
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
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 9 visitantes