VACUUM

VACUUM — recolecta basura y opcionalmente analiza una base de datos

Synopsis

VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]

donde option puede ser una de:

    FULL [ boolean ]
    FREEZE [ boolean ]
    VERBOSE [ boolean ]
    ANALYZE [ boolean ]
    DISABLE_PAGE_SKIPPING [ boolean ]
    SKIP_LOCKED [ boolean ]
    INDEX_CLEANUP { AUTO | ON | OFF }
    PROCESS_MAIN [ boolean ]
    PROCESS_TOAST [ boolean ]
    TRUNCATE [ boolean ]
    PARALLEL integer
    SKIP_DATABASE_STATS [ boolean ]
    ONLY_DATABASE_STATS [ boolean ]
    BUFFER_USAGE_LIMIT size

y table_and_columns es:

    [ ONLY ] table_name [ * ] [ ( column_name [, ...] ) ]

Descripción

VACUUM recupera el almacenamiento ocupado por las tuplas muertas. En el funcionamiento normal de PostgreSQL, las tuplas que se eliminan o que quedan obsoletas debido a una actualización no se eliminan físicamente de su tabla; permanecen presentes hasta que se realiza un VACUUM. Por lo tanto, es necesario realizar un VACUUM periódicamente, especialmente en tablas que se actualizan con frecuencia.

Sin una lista table_and_columns, VACUUM procesa cada tabla y vista materializada en la base de datos actual que el usuario actual tiene permiso para vaciar. Con una lista, VACUUM procesa únicamente esas tablas.

VACUUM ANALYZE realiza un VACUUM y luego un ANALYZE para cada tabla seleccionada. Esta es una forma combinada muy útil para los scripts de mantenimiento rutinario. Consulta la ANALYZE para obtener más detalles sobre su procesamiento.

El comando VACUUM simple (sin FULL) simplemente recupera espacio y lo hace disponible para su reutilización. Esta forma del comando puede operar en paralelo con la lectura y escritura normal de la tabla, ya que no se obtiene un bloqueo exclusivo. Sin embargo, el espacio adicional no se devuelve al sistema operativo (en la mayoría de los casos); simplemente se mantiene disponible para su reutilización dentro de la misma tabla. También nos permite aprovechar múltiples CPU para procesar índices. Esta característica se conoce como vaciado en paralelo («parallel vacuum»). Para desactivar esta característica, se puede utilizar la opción PARALLEL y especificar cero trabajadores paralelos. VACUUM FULL reescribe todo el contenido de la tabla en un nuevo archivo de disco sin espacio adicional, lo que permite devolver el espacio no utilizado al sistema operativo. Esta forma es mucho más lenta y requiere un bloqueo ACCESS EXCLUSIVE en cada tabla mientras se está procesando.

Parámetros

FULL

Selecciona el vaciado completo («full vacuum»), que puede recuperar más espacio, pero tarde mucho más y bloquea la tabla de forma exclusiva. Este método también requiere espacio en disco adicional, ya que escribe una nueva copia de la tabla y no libera la copia antigua hasta que se completa la operación. Normalmente, esto solo debe usarse cuando se necesita recuperar una cantidad significativa de espacio de la tabla.

FREEZE

Selecciona la «congelación» («freezing») agresiva de tuplas. Especificar FREEZE es equivalente a realizar VACUUM con los parámetros vacuum_freeze_min_age y vacuum_freeze_table_age establecidos en cero. La congelación agresiva siempre se realiza cuando se reescribe la tabla, por lo que esta opción es redundante cuando se especifica FULL.

VERBOSE

Imprime un informe detallado de la actividad de vaciado para cada tabla a nivel INFO.

ANALYZE

Actualiza las estadísticas utilizadas por el planificador para determinar la forma más eficiente de ejecutar una consulta.

DISABLE_PAGE_SKIPPING

Normalmente, VACUUM omitirá páginas basándose en el mapa de visibilidad. Las páginas donde se sabe que todas las tuplas están congeladas siempre se pueden omitir, y aquellas donde se sabe que todas las tuplas son visibles para todas las transacciones se pueden omitir, excepto cuando se realiza un vaciado agresivo. Además, excepto cuando se realiza un vaciado agresivo, algunas páginas pueden omitirse para evitar esperar a que otras sesiones terminen de usarlas. Esta opción desactiva todo el comportamiento de omisión de páginas y está diseñada para usarse solo cuando se sospecha del contenido del mapa de visibilidad, lo que debería ocurrir solo si hay un problema de hardware o software que cause la corrupción de la base de datos.

SKIP_LOCKED

Especifica que VACUUM no debe esperar a que se liberen los bloqueos conflictivos cuando comienza a trabajar en una relación: si una relación no se puede bloquear inmediatamente sin esperar, la relación se omite. Ten en cuenta que incluso con esta opción, VACUUM aún puede bloquearse al abrir los índices de la relación. Además, VACUUM ANALYZE aún puede bloquearse al adquirir filas de muestra de particiones, hijos de herencia de tablas y algunos tipos de tablas foráneas. Además, aunque VACUUM normalmente procesa todas las particiones de las tablas particionadas especificadas, esta opción hará que VACUUM omita todas las particiones si hay un bloqueo conflictivo en la tabla particionada.

INDEX_CLEANUP

Normalmente, VACUUM omitirá el vaciado de índices cuando haya muy pocas tuplas muertas en la tabla. Se espera que el costo de procesar todos los índices de la tabla supere con creces el beneficio de eliminar las tuplas de índices muertas cuando esto sucede. Esta opción se puede usar para forzar a VACUUM a procesar índices cuando hay más de cero tuplas muertas. El valor predeterminado es AUTO, que permite a VACUUM omitir el vaciado de índices cuando sea apropiado. Si INDEX_CLEANUP se establece en ON, VACUUM eliminará de forma conservadora todas las tuplas muertas de los índices. Esto puede ser útil para la compatibilidad con versiones anteriores de PostgreSQL donde este era el comportamiento estándar.

INDEX_CLEANUP también se puede configurar en OFF para forzar a VACUUM a siempre omitir el vaciado de índices, incluso cuando hay muchas tuplas muertas en la tabla. Esto puede ser útil cuando es necesario hacer que VACUUM se ejecute lo más rápido posible para evitar un desbordamiento inminente del ID de transacción (consulta la Section 24.1.5). Sin embargo, el mecanismo a prueba de fallas de desbordamiento controlado por vacuum_failsafe_age generalmente se activará automáticamente para evitar fallas por desbordamiento del ID de transacción, y debería ser preferido. Si el vaciado de índices no se realiza con regularidad, el rendimiento puede sufrir, porque a medida que se modifica la tabla, los índices acumularán tuplas muertas y la tabla misma acumulará punteros de fila muertos que no se pueden eliminar hasta que se complete la limpieza del índice.

Esta opción no tiene efecto en tablas que no tienen índices y se ignora si se utiliza la opción FULL. Tampoco tiene efecto en el mecanismo a prueba de fallas de desbordamiento del ID de transacción. Cuando se activa, omitirá el vaciado de índices, incluso cuando INDEX_CLEANUP esté configurado en ON.

PROCESS_MAIN

Especifica que VACUUM debe intentar procesar la relación principal. Este suele ser el comportamiento deseado y es el valor predeterminado. Configurar esta opción en falso puede ser útil cuando solo es necesario vaciar la tabla TOAST correspondiente a una relación.

PROCESS_TOAST

Especifica que VACUUM debe intentar procesar la tabla TOAST correspondiente para cada relación, si existe. Este suele ser el comportamiento deseado y es el valor predeterminado. Configurar esta opción en falso puede ser útil cuando solo es necesario vaciar la relación principal. Esta opción es requerida cuando se utiliza la opción FULL.

TRUNCATE

Especifica que VACUUM debe intentar truncar las páginas vacías al final de la tabla y permitir que el espacio en disco de las páginas truncadas se devuelva al sistema operativo. Este suele ser el comportamiento deseado y es el valor predeterminado, a menos que vacuum_truncate se establezca en falso o la opción vacuum_truncate se haya establecido en falso para la tabla a vaciar. Configurar esta opción en falso puede ser útil para evitar el bloqueo ACCESS EXCLUSIVE en la tabla que requiere el truncamiento. Esta opción se ignora si se utiliza la opción FULL.

PARALLEL

Realiza las fases de vaciado y limpieza de índices de VACUUM en paralelo utilizando trabajadores en segundo plano (integer background workers) (para los detalles de cada fase de vaciado, consulta la Table 27.46). El número de trabajadores utilizados para realizar la operación es igual al número de índices de la relación que admiten el vaciado en paralelo, limitado por el número de trabajadores especificado con la opción PARALLEL, si la hay, que a su vez está limitado por max_parallel_maintenance_workers. Un índice puede participar en el vaciado en paralelo si y solo si el tamaño del índice es mayor que min_parallel_index_scan_size. Ten en cuenta que no se garantiza que se utilice la cantidad de trabajadores paralelos especificada en integer durante la ejecución. Es posible que un vaciado se ejecute con menos trabajadores de los especificados, o incluso sin ningún trabajador. Solo se puede usar un trabajador por índice. Por lo tanto, los trabajadores paralelos se inician solo cuando hay al menos 2 índices en la tabla. Los trabajadores para el vaciado se inician antes del comienzo de cada fase y salen al final de la misma. Estos comportamientos podrían cambiar en una versión futura. Esta opción no se puede usar con la opción FULL.

SKIP_DATABASE_STATS

Especifica que VACUUM debe omitir la actualización de las estadísticas de toda la base de datos sobre los XID no congelados más antiguos. Normalmente, VACUUM actualizará estas estadísticas una vez al final del comando. Sin embargo, esto puede llevar algún tiempo en una base de datos con una gran cantidad de tablas, y no logrará nada a menos que la tabla que contenía el XID no congelado más antiguo estuviera entre las vaciadas. Además, si se emiten múltiples comandos VACUUM en paralelo, solo uno de ellos puede actualizar las estadísticas de toda la base de datos a la vez. Por lo tanto, si una aplicación tiene la intención de emitir una serie de muchos comandos VACUUM, puede ser útil configurar esta opción en todos menos en el último comando; o configurarla en todos los comandos y emitir por separado VACUUM (ONLY_DATABASE_STATS) posteriormente.

ONLY_DATABASE_STATS

Especifica que VACUUM no debe hacer nada excepto actualizar las estadísticas de toda la base de datos sobre los XID no congelados más antiguos. Cuando se especifica esta opción, la lista table_and_columns debe estar vacía y no se puede habilitar ninguna otra opción excepto VERBOSE.

BUFFER_USAGE_LIMIT

Especifica el tamaño del búfer en anillo de la estrategia de acceso al búfer para VACUUM. Este tamaño se utiliza para calcular el número de búferes compartidos que se reutilizarán como parte de esta estrategia. El valor 0 desactiva el uso de una Buffer Access Strategy. Si también se especifica ANALYZE, el valor de BUFFER_USAGE_LIMIT se utiliza tanto para la etapa de vaciado como para la de análisis. Esta opción no se puede usar con la opción FULL, excepto si también se especifica ANALYZE. Cuando no se especifica esta opción, VACUUM utiliza el valor de vacuum_buffer_usage_limit. Configuraciones más altas pueden permitir que VACUUM se ejecute más rápidamente, pero una configuración demasiado grande puede causar que demasiadas otras páginas útiles sean expulsadas de los búferes compartidos. El valor mínimo es 128 kB y el valor máximo es 16 GB.

boolean

Especifica si la opción seleccionada debe activarse o desactivarse. Puedes escribir TRUE, ON o 1 para activar la opción, y FALSE, OFF o 0 para desactivarla. El valor boolean también se puede omitir, en cuyo caso se asume TRUE.

integer

Especifica un valor entero no negativo pasado a la opción seleccionada.

size

Especifica una cantidad de memoria en kilobytes. Los tamaños también se pueden especificar como una cadena que contiene el tamaño numérico seguido de cualquiera de las siguientes unidades de memoria: B (bytes), kB (kilobytes), MB (megabytes), GB (gigabytes) o TB (terabytes).

table_name

El nombre (opcionalmente calificado por esquema) de una tabla o vista materializada específica para vaciar. Si se especifica ONLY antes del nombre de la tabla, solo se vacía esa tabla. Si no se especifica ONLY, la tabla y todas sus tablas de herencia hijas o particiones (si las hay) también se vacían. Opcionalmente, se puede especificar * después del nombre de la tabla para indicar explícitamente que se deben vaciar las tablas de herencia hijas (o particiones).

column_name

El nombre de una columna específica a analizar. Por defecto son todas las columnas. Si se especifica una lista de columnas, también debe especificarse ANALYZE.

Salidas

Cuando se especifica VERBOSE, VACUUM emite mensajes de progreso para indicar qué tabla se está procesando actualmente. También se imprimen varias estadísticas sobre las tablas.

Notas

Para vaciar una tabla, normalmente se debe tener el privilegio MAINTAIN sobre la misma. Sin embargo, a los propietarios de bases de datos se les permite vaciar todas las tablas de sus bases de datos, excepto los catálogos compartidos. VACUUM omitirá cualquier tabla que el usuario que realiza la llamada no tenga permiso para vaciar.

Mientras se ejecuta VACUUM, el search_path se cambia temporalmente a pg_catalog, pg_temp.

VACUUM no se puede ejecutar dentro de un bloque de transacción.

Para tablas con índices GIN, VACUUM (en cualquier forma) también completa cualquier inserción de índice pendiente, moviendo las entradas de índice pendientes a los lugares apropiados en la estructura principal del índice GIN. Consulta la Section 65.4.4.1 para obtener más detalles.

Recomendamos que todas las bases de datos se vacíen regularmente para eliminar las filas muertas. PostgreSQL incluye una función de «autovacuum» que puede automatizar el mantenimiento rutinario de vaciado. Para obtener más información sobre el vaciado automático y manual, consulta la Section 24.1.

La opción FULL no se recomienda para el uso rutinario, pero podría ser útil en casos especiales. Un ejemplo es cuando has eliminado o actualizado la mayoría de las filas de una tabla y deseas que la tabla se reduzca físicamente para ocupar menos espacio en disco y permitir escaneos de tabla más rápidos. VACUUM FULL generalmente reducirá la tabla más de lo que lo haría un VACUUM simple.

La opción PARALLEL se utiliza únicamente con fines de vaciado. Si se especifica esta opción junto con la opción ANALYZE, no afecta a ANALYZE.

VACUUM provoca un aumento sustancial en el tráfico de E/S, lo que podría provocar un rendimiento deficiente para otras sesiones activas. Por lo tanto, a veces es aconsejable utilizar la función de retraso de vaciado basada en el costo. Para el vaciado en paralelo, cada trabajador duerme en proporción al trabajo realizado por ese trabajador. Consulta la Section 19.10.2 para obtener más detalles.

Cada proceso en segundo plano que ejecute VACUUM sin la opción FULL informará de su progreso en la vista pg_stat_progress_vacuum. Los procesos en segundo plano que ejecuten VACUUM FULL informarán de su progreso en la vista pg_stat_progress_cluster en su lugar. Consulta la Section 27.4.5 y la Section 27.4.2 para obtener más detalles.

Ejemplos

Para limpiar una sola tabla onek, analizarla para el optimizador e imprimir un informe detallado de la actividad de vaciado:

VACUUM (VERBOSE, ANALYZE) onek;

Compatibilidad

No existe la sentencia VACUUM en el estándar SQL.

La siguiente sintaxis se utilizaba antes de la versión 9.0 de PostgreSQL y todavía es compatible:

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]

Ten en cuenta que en esta sintaxis, las opciones deben especificarse exactamente en el orden mostrado.

Véase también

vacuumdb, Section 19.10.2, Section 24.1.6, Section 27.4.5, Section 27.4.2