Skip to content

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.

mermaid
flowchart LR
  A["UPDATE frecuente"] --> B["versiones antiguas"]
  B --> C["bloat"]
  C --> D["VACUUM"]
  D --> E["espacio reutilizable"]

VACUUM

sql
VACUUM tabla;

VACUUM libera espacio para reutilizacion interna, pero no siempre devuelve espacio al sistema operativo.

VACUUM FULL

sql
VACUUM FULL tabla;

Reescribe la tabla y bloquea mas agresivamente. Debe usarse con cuidado.

ANALYZE

sql
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:

sql
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 FULL en 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.