Succión y análisis automáticos de las tablas
Autovacuum es un daemon (es decir, se ejecuta en segundo plano) que succiona (limpia) automáticamente las tuplas inactivas, recupera el almacenamiento y recopila estadísticas. Comprueba si hay tablas hinchadas en la base de datos y borra esa sobrecarga para poder reutilizar el espacio. Supervisa las tablas y los índices de las bases de datos y los agrega a una tarea de succión cuando alcanzan un límite específico de operaciones de actualización o eliminación.
Autovacuum administra la succión mediante la automatización de los comandos VACUUM y ANALYZE de PostgreSQL. VACUUM elimina la sobrecarga de las tablas y recupera espacio, a la vez que ANALYZE actualiza las estadísticas que permiten al optimizador elaborar planes eficientes. VACUUM también lleva a cabo una importante tarea denominada congelación por succión para evitar problemas relacionados con los ID de las transacciones en la base de datos. Cada fila que se actualiza en la base de datos recibe un ID de transacción de parte del mecanismo de control de transacciones de PostgreSQL. Estos ID controlan la visibilidad de la fila frente a otras transacciones simultáneas. El ID de la transacción es un número de 32 bits. Siempre se guardan dos mil millones de ID en el pasado visible. Los ID restantes (unos 2200 millones) se conservan para las transacciones que se realizarán en el futuro y se ocultan en la transacción actual. PostgreSQL necesita que se realicen limpiezas y congelaciones de las filas antiguas de forma ocasional para evitar que las transacciones se acumulen y hagan invisibles las filas antiguas existentes cuando se crean nuevas transacciones. Para obtener más información, consulte Preventing Transaction ID Wraparound Failures
Autovacuum es una funcionalidad recomendada y está activada de manera predeterminada. Acepta los siguientes parámetros:
Parámetro |
Descripción |
Predeterminado para Amazon RDS |
Predeterminado para Aurora |
|
El número mínimo de operaciones de actualización o eliminación de tuplas que deben realizarse en una tabla antes de que autovacuum la succione. |
50 operaciones |
50 operaciones |
|
El número mínimo de inserciones, actualizaciones o eliminaciones de tuplas que deben producirse en una tabla antes de que autovacuum la analice. |
50 operaciones |
50 operaciones |
|
El porcentaje de tuplas que deben modificarse en una tabla antes de que autovacuum la succione. |
0.1 |
0.1 |
|
El porcentaje de tuplas que deben modificarse en una tabla antes de que autovacuum la analice. |
0,05 |
0,05 |
|
La antigüedad máxima de los ID congelados antes de que se succione una tabla para evitar problemas relacionados con el reinicio de los ID de transacción. |
200 000 000 de transacciones |
200 000 000 de transacciones |
Autovacuum crea una lista de tablas para procesarlas en función de fórmulas de umbral específicas, de la siguiente manera.
-
Umbral para ejecutar
VACUUMen una tabla:vacuum threshold = autovacuum_vacuum_threshold + (autovacuum_vacuum_scale_factor * Total row count of table) -
Umbral para ejecutar
ANALYZEen una tabla:analyze threshold = autovacuum_analyze_threshold + (autovacuum_analyze_scale_factor * Total row count of table)
En el caos de las tablas pequeñas o medianas, los valores predeterminados pueden ser suficientes. Sin embargo, una tabla grande que tenga modificaciones de datos frecuentes tendrá un mayor número de tuplas inactivas. En este caso, es posible que autovacuum procese la tabla con frecuencia para realizar tareas de mantenimiento y que las tareas de mantenimiento de otras tablas se retrasen o se ignoren hasta que se acabe la tabla grande. Para evitar esta situación, puede ajustar los parámetros de autovacuum que se describen en la siguiente sección.
Parámetros de autovacuum relacionados con la memoria
autovacuum_max_workers
Especifica el número máximo de procesos de autovacuum (aparte del iniciador de autovacuum) que se pueden ejecutar al mismo tiempo. Este parámetro solo se puede configurar al iniciar el servidor. Si el proceso de autovacuum está ocupado con una tabla grande, este parámetro ayuda a realizar la succión en otras tablas.
maintenance_work_mem
Especifica la cantidad máxima de memoria que se utilizará para las operaciones de mantenimiento, como VACUUM, CREATE INDEX y ALTER. En Amazon RDS y Aurora, la memoria se asigna en función de la clase de instancia mediante la fórmula GREATEST({DBInstanceClassMemory/63963136*1024},65536). Cuando se ejecuta autovacuum, se puede asignar hasta autovacuum_max_workers veces el valor calculado, así que procure no establecer un valor demasiado alto. Para controlarlo, puede configurar autovacuum_work_mem por separado.
autovacuum_work_mem
Establece la memoria máxima que puede utilizar cada proceso de trabajo de autovacuum. El valor predeterminado de este parámetro es -1, lo que indica que debe utilizar el valor de maintenance_work_mem en su lugar.
Para obtener más información sobre los parámetros de memoria de autovacuum, consulte Asignación de memoria para autovacuum en la documentación de Amazon RDS.
Ajuste de los parámetros de autovacuum
Es posible que los usuarios tengan que ajustar los parámetros de autovacuum en función de sus operaciones de actualización y eliminación. Los parámetros siguientes se pueden configurar por tabla, instancia o clúster.
A nivel de instancia o clúster
Como ejemplo, veamos una base de datos del sector bancario en la que se esperan operaciones continuas con el lenguaje de manipulación de datos (DML). Para mantener el estado de la base de datos, debe ajustar los parámetros de autovacuum a nivel de clúster para Aurora y a nivel de instancia para Amazon RDS, y aplicar también el mismo grupo de parámetros al lector. En caso de que se produzca una conmutación por error, debe aplicar los mismos parámetros al nuevo escritor.
Nivel de tabla
Por ejemplo, en una base de datos relacionada con la entrega de alimentos en la que se esperan operaciones con DML continuas en una sola tabla llamada orders, debería valorar si ajustar el parámetro autovacuum_analyze_threshold a nivel de tabla mediante el siguiente comando:
ALTER TABLE <table_name> SET (autovacuum_analyze_threshold = <threshold rows>)
Uso de una configuración de autovacuum agresiva a nivel de tabla
El ejemplo de la tabla orders que tiene operaciones de actualización y eliminación continuas se convierte en una buena opción para realizar la succión debido a la configuración de autovacuum predeterminada. Esto provoca que se hagan planes incorrectos y que las consultas sean lentas. Eliminar la sobrecarga y actualizar las estadísticas requiere una configuración de autovacuum agresiva a nivel de tabla.
Para determinar la configuración, lleve un registro de la duración de las consultas que se ejecutan en esta tabla e identifique el porcentaje de operaciones con DML que hacen cambiar los planes. La vista pg_stat_user_tables lo ayuda a realizar un seguimiento de las operaciones de inserción, actualización y eliminación.
Ejemplo:
Supongamos que el optimizador hace planes incorrectos cada vez que cambia el 5 % de la tabla orders. En este caso, debe cambiar el umbral del factor de escala al 2 %, como se indica a continuación:
ALTER TABLE orders SET (autovacuum_vacuum_scale_factor = 0.02)
sugerencia
Seleccione cuidadosamente la configuración de autovacuum agresiva para evitar un consumo elevado de los recursos.
Para obtener más información, consulte los siguientes temas:
-
Understanding autovacuum in Amazon RDS for PostgreSQL environments
(entrada en el blog de AWS) -
Automatic Vacuuming
(documentación de PostgreSQL) -
Tuning PostgreSQL parameters in Amazon RDS and Amazon Aurora (Recomendaciones de AWS)
Para asegurarse de que autovacuum funcione de forma eficaz, supervise las filas inactivas, el uso del disco y la última vez que autovacuum o ANALYZE se ejecutó de forma periódica. La vista pg_stat_all_tables proporciona información sobre cada tabla (relname) y sobre cuántas tuplas inactivas (n_dead_tup) hay en la tabla.
Supervisar la cantidad de tuplas inactivas que hay en cada tabla, especialmente en las que se actualizan con frecuencia, permite determinar si los procesos de autovacuum eliminan periódicamente las tuplas inactivas para reutilizar el espacio en disco y mejorar el rendimiento. Puede utilizar la siguiente consulta para comprobar la cantidad de tuplas muertas y la hora de la última ejecución de autovacuum en las tablas:
SELECT relname AS TableName,n_live_tup AS LiveTuples,n_dead_tup AS DeadTuples, last_autovacuum AS Autovacuum,last_autoanalyze AS Autoanalyze_FROM pg_stat_user_tables;
Ventajas y limitaciones
Autovacuum ofrece las siguientes ventajas:
-
Elimina automáticamente la sobrecarga de las tablas.
-
Evita el reinicio de los ID de transacción.
-
Mantiene actualizadas las estadísticas de la base de datos.
Limitaciones:
-
Si las consultas utilizan el procesamiento paralelo, es posible que la cantidad de procesos de trabajo no sea suficiente para el autovacuum.
-
Si autovacuum se ejecuta durante las horas pico, es posible que aumente la utilización de los recursos. Debe ajustar los parámetros para solucionar este problema.
-
Si las páginas de la tabla están ocupadas en otra sesión, es posible que autovacuum las omita.
-
Autovacuum no puede acceder a las tablas temporales.