Conceptos básicos de VACUUM
UPDATE y DELETE dejan versiones de filas muertas hasta que VACUUM recupera espacio y actualiza los mapas de visibilidad. PostgreSQL 18.4 no devuelve bytes de archivo al sistema operativo inmediatamente, excepto en casos especiales.
Receta
Tarjeta de referencia rápida - lista para copiar y pegar.
VACUUM (VERBOSE, ANALYZE) orders;
SELECT n_dead_tup, n_live_tup, last_vacuum, last_autovacuum
FROM pg_stat_user_tables
WHERE relname = 'orders';Cuándo usar esto: La tabla crece después de eliminaciones, los escaneos secuenciales se ralentizan o los escaneos solo con índice dejan de aparecer.
Ejemplo de trabajo
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';Lo que esto demuestra:
- Acumulación de tuplas muertas
VACUUMmarca el espacio como reutilizable dentro del archivo- Monitorización a través de
pg_stat_user_tables
Profundización
Cómo funciona
- MVCC mantiene las versiones de fila antiguas visibles para las transacciones abiertas.
VACUUMescanea páginas, elimina tuplas muertas, congela horizontes xmin, actualiza FSM y el mapa de visibilidad.VACUUM FULLreescribe la tabla exclusivamente (riesgo de tiempo de inactividad); prefierapg_repackpara reducir el tamaño en línea.- Autovacuum lanza trabajadores basándose en umbrales de
n_dead_tup.
Variantes de VACUUM
| Comando | Efecto |
|---|---|
VACUUM | Recupera espacio muerto en el lugar |
VACUUM ANALYZE | Vacuum más actualización de estadísticas |
VACUUM FREEZE | Congelación agresiva para evitar el wraparound |
VACUUM FULL | Bloqueo exclusivo, reescribe el archivo |
Notas SQL
EXPLAIN (ANALYZE, BUFFERS)
SELECT count(*) FROM orders WHERE status = 'open';
-- El escaneo solo con índice necesita un mapa de visibilidad actualizado de vacuumTrampas comunes
- Esperar que DELETE reduzca el disco inmediatamente - Los archivos permanecen grandes; el espacio se reutiliza para inserciones. Solución:
pg_repacko eliminación de particiones para una reducción real. - Desactivar autovacuum en tablas activas - Riesgo de wraparound del ID de transacción. Solución: Ajuste por tabla, no desactivar.
- Transacciones largas bloquean vacuum - Las tuplas muertas no se pueden eliminar. Solución: Matar sesiones inactivas en transacción; establecer
idle_in_transaction_session_timeout. - Asumir que vacuum soluciona completamente el bloat del índice - Los índices necesitan rutas de limpieza separadas. Solución:
REINDEX CONCURRENTLYo repack. - Ejecutar VACUUM FULL en horas pico de producción - Acceso a bloqueo exclusivo. Solución: Ventana de mantenimiento o herramientas en línea.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| Particionamiento de tablas | Eliminar particiones antiguas en lugar de eliminar | Tablas de dimensión pequeñas |
| pg_repack | Necesita reducir el disco en línea | Vacuum simple es suficiente |
| Archivar + truncar | Purga histórica masiva | Complejidad de claves foráneas |
Preguntas frecuentes
¿Con qué frecuencia se ejecuta autovacuum?
Cuando se alcanzan los umbrales de tuplas muertas por tabla y hay trabajadores disponibles.
¿Vacuum bloquea las lecturas?
No; utiliza ShareUpdateExclusiveLock compatible con DML.
¿Propósito del mapa de visibilidad?
Permite escaneos solo con índice cuando todas las tuplas de la página son visibles.
¿Congelar xmin?
Previene el wraparound del ID de transacción; crítico para la salud del clúster.
¿Retraso de coste de vacuum?
Limita la E/S de vacuum a través de la configuración autovacuum_vacuum_cost_delay.
¿Vacuum de TOAST?
Los valores grandes en las tablas TOAST se limpian por separado; consulte la página de TOAST.
¿Vista de monitorización?
pg_stat_user_tables más pg_stat_progress_vacuum para trabajadores activos.
¿Manual vs. automático?
Automático maneja el estado estable; manual después de operaciones masivas o emergencias.
¿Vacuum en réplica?
Las réplicas no ejecutan vacuum en tablas de usuario; solo el primario.
¿Siguiente?
Ajuste de Autovacuum para tablas activas.
Relacionado
- Ajuste de Autovacuum - Umbrales de trabajadores
- Wraparound de ID de Transacción - Urgencia de congelación
- Bloat de Tablas e Índices - Medición
- Conceptos básicos de MVCC - Por qué existen las tuplas muertas
Versiones de Stack: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.