Succión y análisis automáticos de las tablas - Recomendaciones de AWS

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 en la documentación de PostgreSQL.

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

autovacuum_vacuum_threshold

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

autovacuum_analyze_threshold

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

autovacuum_vacuum_scale_factor

El porcentaje de tuplas que deben modificarse en una tabla antes de que autovacuum la succione.

0.1

0.1

autovacuum_analyze_scale_factor

El porcentaje de tuplas que deben modificarse en una tabla antes de que autovacuum la analice.

0,05

0,05

autovacuum_freeze_max_age

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 VACUUM en una tabla:

    vacuum threshold = autovacuum_vacuum_threshold + (autovacuum_vacuum_scale_factor * Total row count of table)
  • Umbral para ejecutar ANALYZE en 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:

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.