Estamos executando o Oracle 11.2.0.4.0. É um banco de dados transacional que está online desde 2011. Temos a tarefa de limpar registros antigos.
A estrutura da tabela é (pai->filho):
A->BC->D->E
E tem tabelas filhas F, G->H
Todas as tabelas possuem datas exceto H. Existem relações PK-FK para a estrutura da tabela descrita.
No momento, todas as tabelas, exceto G, têm cerca de 70 milhões de registros. G tem cerca de 500 milhões de registros.
Se eu tentar excluir juntando as tabelas, a consulta sozinha em um backup de produção levará vários minutos para ser executada apenas para a consulta. Além disso, os requisitos para exclusão removerão vários milhões de linhas de uma só vez. temos uma janela de tempo limitada para executar exclusões.
Eu executei algumas análises de dados e atualmente a exclusão removerá cerca de 40% dos dados. Além disso, o sistema não pode ser desativado por um longo período de tempo.
Qual é a melhor estratégia para remover os registros antigos?
Possíveis estratégias/abordagens:
Sete exclusões usando subconsultas/junções para obter os IDs a serem removidos. Estaríamos juntando até 7 tabelas (menor filho).
Consulte cada tabela em busca de IDs a serem excluídos e armazene-os em uma tabela temporária. O uso dessa tabela temporária obtém os registros para o próximo filho. Depois de ter todos os IDs, exclua os registros com algo assim:
delete from H where PKID IN (Selecione PKID from tempH) delete from G where PKID IN (Selecione PKID from tempG)
Haveria outras alternativas possíveis? Provavelmente, eu executaria esse processo várias vezes, excluindo uma quantidade X de dados. (Valor da semana/Valor dos meses, etc.) Acho que não consigo acompanhar uma exclusão massiva.