Noções Básicas de Vacuum
UPDATE e DELETE deixam versões de linhas mortas até que o vacuum recupere o espaço e atualize os mapas de visibilidade. O PostgreSQL 18.4 não retorna bytes do arquivo para o SO imediatamente, exceto em casos especiais.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
VACUUM (VERBOSE, ANALYZE) orders;
SELECT n_dead_tup, n_live_tup, last_vacuum, last_autovacuum
FROM pg_stat_user_tables
WHERE relname = 'orders';Quando usar isso: A tabela cresce após exclusões, scans sequenciais ficam lentos ou scans apenas por índice param de aparecer.
Exemplo de Trabalho
CREATE TABLE orders (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
status text NOT NULL,
note text
);
INSERT INTO orders (status, note)
SELECT 'open', 'row-' || i FROM generate_series(1, 50000) i;
UPDATE orders SET status = 'closed' WHERE id % 2 = 0;
DELETE FROM orders WHERE id % 5 = 0;
SELECT relname, n_live_tup, n_dead_tup, last_vacuum
FROM pg_stat_user_tables
WHERE relname = 'orders';
VACUUM (VERBOSE) orders;
SELECT relname, n_live_tup, n_dead_tup, last_vacuum
FROM pg_stat_user_tables
WHERE relname = 'orders';O que isso demonstra:
- Acúmulo de tuplas mortas
VACUUMmarca o espaço como reutilizável dentro do arquivo- Monitoramento via
pg_stat_user_tables
Mergulho Profundo
Como Funciona
- MVCC mantém versões antigas de linhas visíveis para transações abertas.
- Vacuum escaneia páginas, remove tuplas mortas, congela horizontes xmin, atualiza FSM e mapa de visibilidade.
VACUUM FULLreescreve a tabela exclusivamente (risco de tempo de inatividade); prefirapg_repackpara encolhimento online.- Autovacuum lança workers com base em limiares de
n_dead_tup.
Variantes de Vacuum
| Comando | Efeito |
|---|---|
VACUUM | Recupera espaço morto no local |
VACUUM ANALYZE | Vacuum mais atualização de estatísticas |
VACUUM FREEZE | Congelamento agressivo para wraparound |
VACUUM FULL | Bloqueio exclusivo, reescreve o arquivo |
Notas SQL
EXPLAIN (ANALYZE, BUFFERS)
SELECT count(*) FROM orders WHERE status = 'open';
-- Index Only Scan precisa de um mapa de visibilidade atualizado do vacuumArmadilhas
- Esperar que DELETE encolha o disco imediatamente - Arquivos permanecem grandes; espaço reutilizado para inserções. Correção:
pg_repackou exclusão de partição para encolhimento real. - Desativar autovacuum em tabelas quentes - Risco de estouro de ID de transação. Correção: Ajuste por tabela, não desativar.
- Transações longas bloqueiam o vacuum - Tuplas mortas não podem ser removidas. Correção: Matar sessões ociosas em transação; definir
idle_in_transaction_session_timeout. - Assumir que vacuum corrige completamente o bloat de índice - Índices precisam de caminhos de limpeza separados. Correção:
REINDEX CONCURRENTLYou repack. - Executar VACUUM FULL no pico de produção - Acesso a bloqueio exclusivo. Correção: Janela de manutenção ou ferramentas online.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Particionamento de Tabela | Excluir partições antigas em vez de deletar | Tabelas de dimensão pequenas |
| pg_repack | Necessidade de encolhimento de disco online | Vacuum simples é suficiente |
| Arquivar + truncar | Limpeza histórica em massa | Complexidade de FK |
FAQs
Com que frequência o autovacuum é executado?
Quando os limiares de tuplas mortas atingem as configurações por tabela e os workers estão disponíveis.
O vacuum bloqueia leituras?
Não; usa ShareUpdateExclusiveLock compatível com DML.
propósito do mapa de visibilidade?
Permite scans apenas por índice quando todas as tuplas na página estão visíveis.
freeze xmin?
Previne o estouro do ID da transação; crítico para a saúde do cluster.
vacuum cost delay?
Limita o I/O do vacuum através das configurações de autovacuum_vacuum_cost_delay.
toast vacuum?
Valores grandes em tabelas TOAST são limpos separadamente; veja a página TOAST.
view de monitoramento?
pg_stat_user_tables mais pg_stat_progress_vacuum para workers ativos.
manual vs automático?
Automático lida com estado estável; manual após operações em massa ou emergências.
replica vacuum?
Standbys não executam vacuum em tabelas de usuário; apenas o primário.
Próximo?
Ajuste do Autovacuum para tabelas quentes.
Relacionado
- Ajuste do Autovacuum - Limiares de workers
- Estouro de ID de Transação - Urgência do congelamento
- Bloat de Tabela e Índice - Medição
- Noções Básicas de MVCC - Por que tuplas mortas existem
Versões da Pilha: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.