MVCC, bloat e o papel do VACUUM
Pergunta
Por que o PostgreSQL precisa do VACUUM, e o que é 'table bloat'?
Resposta esperada
O MVCC do Postgres não sobrescreve nem apaga linhas na hora: um `UPDATE` cria uma nova versão da linha e marca a antiga como morta; um `DELETE` só marca. Versões mortas ainda ocupam espaço no arquivo até o VACUUM passar e marcá-las como reutilizáveis (`autovacuum` faz isso em background). Se a taxa de escrita é alta e o autovacuum não acompanha (mal configurado, ou uma transação longa segurando linhas 'vivas pra ela'), as tabelas e índices incham com espaço morto — 'bloat' — o que deixa scans mais lentos (mais páginas pra ler) e infla o disco. `VACUUM` normal recupera espaço pra reuso; `VACUUM FULL` reescreve a tabela compactando (mas trava a tabela). Transação longa aberta é o vilão nº1 do bloat porque impede o vacuum de limpar o que ela ainda poderia enxergar.
Por que perguntam isso
Pergunta sênior de Postgres. Sinal de domínio: 'transação longa é o vilão do bloat' e a diferença VACUUM x VACUUM FULL.