PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

postgresql excluir tabelas de partição


Para quem acaba aqui procurando como excluir as partições da tabela no PostgreSQL, aqui está a resposta moderna.

A solução é não usar uma instrução DELETE porque isso excluirá os dados sem descartar as partições de tabela correspondentes que continham os dados. O OP perguntou sobre o gerenciamento de tabelas de partição, não a exclusão de registros, portanto, qualquer solução que use instruções DELETE adiciona sobrecarga desnecessária ao banco de dados de exclusão de registros, deixa tabelas de partição vazias e ignora completamente um dos principais benefícios do uso de particionamento; Soltar a tabela quando ela não for mais útil.

Nesse caso, a solução deve ser DROP a tabela de partição que não é mais necessária. Eu escrevi uma solução para resolver esse problema no meu ambiente de produção, a resposta é aqui .

Para resolver o problema do OP, a função que escrevi pode ser usada com duas pequenas revisões para modificar o fullTablename variável e o formato de data. A linha da variável fullTablename deve ser alterada de
fullTablename := base_table_name || '_' || to_char(startTime, dateFormat);

para o formato YYYY-MM-DD_log como este
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;

Em seguida, o formato de data precisa ser ligeiramente modificado de
WHEN partition_plan='day'   THEN 'YYYYDDD'

para a convenção de nomenclatura de tabela indicada
WHEN partition_plan='day'   THEN 'YYYY-MM-DD'

Em seguida, a consulta SQL que chama a função para realizar a limpeza pode ser chamada a partir de um script de manutenção diária como este:
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');

O que eliminará as tabelas YYYY-MM-DD_log que são 5 dias com mais de 180 dias atrás. Para uma execução inicial para excluir dezenas ou centenas de partições de tabela antigas, o 5 pode ser definido para um valor muito mais alto que alcance o efeito desejado.