Vacuum, autovacuum y bloat
Por MVCC, PostgreSQL conserva versiones antiguas de filas. Vacuum limpia versiones que ya no son visibles para ninguna transaccion.
Por que existe vacuum
Un UPDATE crea una nueva version de fila. Un DELETE marca una version como no visible. Esas versiones antiguas ocupan espacio hasta que vacuum las procesa.
flowchart LR
A["UPDATE frecuente"] --> B["versiones antiguas"]
B --> C["bloat"]
C --> D["VACUUM"]
D --> E["espacio reutilizable"]VACUUM
VACUUM tabla;VACUUM libera espacio para reutilizacion interna, pero no siempre devuelve espacio al sistema operativo.
VACUUM FULL
VACUUM FULL tabla;Reescribe la tabla y bloquea mas agresivamente. Debe usarse con cuidado.
ANALYZE
ANALYZE tabla;Actualiza estadisticas para que el planner estime mejor.
Autovacuum
Autovacuum ejecuta vacuum y analyze automaticamente.
Senales de problemas:
- Tablas que crecen sin razon.
- Muchas tuplas muertas.
- Consultas cada vez mas lentas.
- Logs de autovacuum frecuentes o fallidos.
Transacciones largas
Una transaccion abierta durante mucho tiempo puede impedir limpiar versiones antiguas.
Consulta:
SELECT pid, state, xact_start, query
FROM pg_stat_activity
WHERE state = 'idle in transaction';Bloat
Bloat es espacio ocupado por versiones antiguas o paginas poco eficientes.
No todo crecimiento es bloat, pero updates/deletes intensivos lo pueden provocar.
Buenas practicas
- Manten transacciones cortas.
- No desactives autovacuum salvo razon extrema.
- Monitoriza tablas con muchos updates/deletes.
- Ajusta autovacuum por tabla si hace falta.
- Reindexa cuando indices tengan bloat significativo.
Errores comunes
- Ejecutar
VACUUM FULLen produccion sin ventana. - Ignorar
idle in transaction. - Pensar que vacuum reduce siempre el archivo en disco.
- Desactivar autovacuum para "mejorar rendimiento".
- No actualizar estadisticas tras grandes cargas.
