No meu banco de dados Postgres tenho uma tabela grande execution_transcripts
com várias colunas. Duas dessas colunas task
são result
colunas JSONB que contêm valores que geralmente estão na faixa de quilobytes e às vezes na faixa de megabytes.
A mesa está ficando muito grande e estamos trabalhando em uma estratégia para reduzir seu tamanho.
Especificamente, SELECT pg_total_relation_size('treeline_schema.execution_transcript')
retorna 22528457179136
cerca de 20 TB.
Como experiência, em uma cópia de nosso banco de dados de produção, executei a seguinte consulta para anular essas duas colunas nas 2.000 linhas inferiores:
UPDATE execution_transcript
SET result = NULL, task = NULL
WHERE id <= 2000 and id > 0;
Feito isso, vejo que o tamanho total da relação aumentou 319,4 kb para 22528457498624
.
Isso ocorre porque tudo que fiz foi acrescentar novos valores a um log e algum processo de compactação subsequente diminuirá o tamanho da relação no futuro? Preciso executar etapas adicionais se quiser diminuir o espaço ocupado pela tabela?
Postgres usa MVCC, e sua implementação significa que quando você atualiza uma linha no PostgreSQL, ele cria internamente uma cópia totalmente nova dessa linha. Isso ocorre porque essa “versão antiga” da linha pode ser necessária para outras transações de longa duração. Entretanto, logo, nada precisa dessas cópias mais antigas e elas se tornam tuplas "mortas".
Remover essas tuplas mortas é tarefa dos processos de aspiração (e autovacuuming) do PostgreSQL.