Preciso excluir cerca de 400 milhões de linhas de uma tabela de 1,3 bilhão de linhas com base em um campo de data indexado.
A tabela tem cerca de 800 GB de tamanho.
Qual é a maneira mais eficiente de excluir os dados sem causar efeitos adversos? A tabela está sob uso intenso, o que significa muitas inserções e atualizações (que não afetam as linhas a serem excluídas).
Há uma janela de manutenção, que seria mais rápida, mas talvez não consiga uma janela de manutenção grande o suficiente. Por outro lado, posso levar meu tempo com a exclusão, então não há pressa.
Achei uma maneira melhor de fazer isso
Insert into new_tbl select * from old_tbl where start_date < now -INTERVAL '2 years'
Durante a janela de tempo de inatividade:
Renomeie
old_tbl
paraold_tbl_drop
enew_tbl
paraold_tbl
.old_tbl_drop
.Resposta do wiki da comunidade :
Escreva um script em lote que faça, digamos, 10.000 exclusões e confirmações, próximos 10.000 e assim por diante.
Você deve escolher um número que possa ser excluído e confirmado rapidamente, para que não interfira por muito tempo em outros processos, mas ainda valha a pena manter as coisas em movimento.
Supondo que você seja capaz de encontrar os registros a serem excluídos, em tempo hábil.
Se você precisar excluir 400 M de uma tabela que é 1,2 B. Isso significa que você deve marcar 400 M linhas mortas. Isso é substancialmente mais rápido do que escrever de novo 3 vezes isso. Portanto, a maneira mais eficiente no PostgreSQL é uma simples
BTW, excluir um bilhão de tantas linhas realmente não é grande coisa. Experimente.
Veja também