El comando VACUUM PostgreSQL es una herramienta clave para cualquier administrador de PostgreSQL. Ayuda a mantener la base de datos en buen estado, elimina datos innecesarios, recupera espacio libre y actualiza las estadísticas para el planificador de consultas.
Es especialmente importante usar el comando VACUUM correctamente en bases de datos en la nube, donde los recursos son limitados y los tiempos de inactividad pueden ser costosos.
Funcionamiento del comando VACUUM PostgreSQL

Arquitectura multiversión y necesidad del comando VACUUM
PostgreSQL usa una arquitectura de almacenamiento de datos multiversión (MVCC, Multi-Version Concurrency Control), que permite ejecutar transacciones simultáneamente sin bloqueos. Cada actualización de una fila no sobrescribe la versión anterior, sino que crea una nueva, mientras que la antigua continúa existiendo mientras otras transacciones puedan necesitarla.
Esto proporciona un alto rendimiento y consistencia de datos, pero lleva a la acumulación de filas “muertas” que ocupan espacio en la tabla y ralentizan las consultas. Si no se eliminan, con el tiempo el rendimiento de la base de datos disminuirá. VACUUM elimina estas filas, liberando espacio y mejorando la eficiencia.
Espacio libre gestionado por el comando VACUUM en FSM
Cuando PostgreSQL elimina o actualiza filas, no limpia inmediatamente el espacio que ocupan en el disco. Ese espacio se marca como libre en el Free Space Map (FSM), que rastrea las áreas de memoria disponibles para reutilización posterior.
El comando VACUUM escanea la tabla, elimina las versiones obsoletas y actualiza el FSM, haciendo que el espacio quede disponible para nuevas entradas. Esto resulta crucial en la nube, donde cada operación de E/S impacta en el rendimiento y el costo.
Congelación de filas con el comando VACUUM y control del xid
En PostgreSQL, cada fila está asociada con un número de transacción (xid), que tiene un rango limitado. Para evitar el desbordamiento de xid, la base de datos congela periódicamente las filas antiguas: un proceso en el que el xid se reemplaza con un FrozenXID especial, que indica que la fila nunca se considerará “nueva”.
El comando VACUUM se encarga de esta congelación. Si no se hace, al alcanzar el límite de xid, PostgreSQL dejará de realizar operaciones de escritura; este es un mecanismo de protección. Por lo tanto, la limpieza regular de las tablas es un aspecto crítico del mantenimiento, especialmente en bases de datos en la nube que funcionan continuamente.
Cómo aplicar correctamente VACUUM en la práctica
El comando VACUUM sin parámetros adicionales elimina las filas “muertas” y actualiza el FSM, pero no libera espacio a nivel del sistema de archivos. Es una operación rápida y segura que se puede realizar regularmente: VACUUM my_table;
Se utiliza para el mantenimiento periódico de las tablas en buen estado sin necesidad de bloqueo.
VACUUM básico para mantenimiento periódico
Si necesitas no solo limpiar la tabla, sino también actualizar las estadísticas utilizadas por el planificador de consultas, debes usar VACUUM ANALYZE:
VACUUM ANALYZE my_table;Este modo es especialmente útil después de grandes volúmenes de inserciones, actualizaciones o eliminaciones; ayuda a mejorar el rendimiento de las consultas SQL posteriores.
VACUUM ANALYZE para limpieza y estadísticas
Si necesitas no solo limpiar la tabla, sino también actualizar las estadísticas utilizadas por el planificador de consultas, debes usar VACUUM ANALYZE:
VACUUM ANALYZE my_table;Este modo es especialmente útil después de grandes volúmenes de inserciones, actualizaciones o eliminaciones; ayuda a mejorar el rendimiento de las consultas SQL posteriores.
VACUUM FULL para liberar espacio en disco
El comando VACUUM FULL es una medida radical. No solo elimina las filas “muertas”, sino que también reconstruye completamente la tabla, liberando espacio a nivel del sistema de archivos:
VACUUM FULL my_table;Sin embargo, esta operación requiere un bloqueo exclusivo de la tabla y puede consumir muchos recursos. Se utiliza con poca frecuencia, principalmente después de eliminaciones masivas.
VACUUM VERBOSE para salida detallada
Para la depuración o el análisis del comportamiento del comando de limpieza, puede usar la bandera VERBOSE:
VACUUM VERBOSE my_table;Esto permite ver información detallada sobre la cantidad de filas procesadas y eliminadas, sobre los xid congelados y otros parámetros. Esta salida ayuda a evaluar la eficacia de la estrategia actual de mantenimiento de la base de datos.
Automatización del comando VACUUM con vacuumdb
Para automatizar las tareas de administración, es útil la utilidad de línea de comandos vacuumdb, que se puede aplicar a tablas específicas o a toda la base de datos:
vacuumdb -d mydb –analyzeTambién se admiten las opciones –full, –verbose, –table, lo que hace que esta herramienta sea conveniente para scripts y programadores de tareas (como cron).
Autovacuum: ejecución automática del comando VACUUM PostgreSQL
PostgreSQL incluye un demonio autovacuum integrado que inicia automáticamente VACUUM y ANALYZE para las tablas cuando se superan ciertos umbrales de filas “muertas”. Esto reduce la necesidad de intervención manual y mantiene la base de datos en funcionamiento.
Sin embargo, autovacuum puede no ser suficiente para tablas con alta carga o que cambian rápidamente. En tales casos:
- Puede aumentar la frecuencia de su activación a través de los parámetros
autovacuum_vacuum_threshold,autovacuum_vacuum_scale_factor; - Asignar prioridad al servicio de tablas específicas a través de
ALTER TABLE … SET (autovacuum_…); - O desactivarlo completamente para algunas tablas y procesarlas manualmente, con precaución.
Un autovacuum correctamente configurado es la clave para un funcionamiento estable de la base de datos, especialmente en entornos en la nube, donde es importante evitar retrasos y tiempos de inactividad.

