VACUUM — recolecta basura y opcionalmente analiza una base de datos
VACUUM [ (option[, ...] ) ] [table_and_columns[, ...] ] dondeoptionpuede 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] PARALLELintegerSKIP_DATABASE_STATS [boolean] ONLY_DATABASE_STATS [boolean] BUFFER_USAGE_LIMITsizeytable_and_columnses: [ ONLY ]table_name[ * ] [ (column_name[, ...] ) ]
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.
FULLSelecciona 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.
ANALYZEActualiza 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.
integerEspecifica 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.
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.
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.
Para limpiar una sola tabla onek, analizarla para el optimizador e imprimir un informe detallado de la actividad de vaciado:
VACUUM (VERBOSE, ANALYZE) onek;
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.