View a markdown version of this page

Administración de recuentos de objetos altos en Amazon RDS para PostgreSQL - Amazon Relational Database Service

Administración de recuentos de objetos altos en Amazon RDS para PostgreSQL

Aunque las limitaciones de PostgreSQL son teóricas, tener recuentos de objetos extremadamente altos en una base de datos provocará un impacto notable en el rendimiento de varias operaciones. Esta documentación cubre varios tipos de objetos comunes que, cuando tienen un recuento total alto, pueden tener varios posibles impactos.

En la tabla siguiente, se proporciona un resumen de los tipos de objetos y sus posibles impactos:

Tipos de objetos e impactos potenciales
Tipo de objeto Limpieza automática Replicación lógica Actualización de la versión principal pg_dump/pg_restore Rendimiento general Reinicio de la instancia
Relaciones x x x x
Tablas temporales x x
Tablas sin registrar x x
Particiones x
Archivos temporales x
Secuencias x
Objetos grandes x x

Relaciones

No hay un límite estricto específico en cuanto al número de tablas en una base de datos de PostgreSQL. El límite teórico es extremadamente alto, pero hay otros límites prácticos que deben tenerse en cuenta al diseñar la base de datos.

Impacto: la limpieza automática se queda atrás

La limpieza automática puede tener dificultades para mantenerse al día con el crecimiento de ID de transacciones o la sobrecarga de la tabla debido a la falta de personal en comparación con la cantidad de trabajo.

Acción recomendada: existen varios factores para ajustar la limpieza automática a fin de que pueda funcionar correctamente con un número determinado de tablas y una carga de trabajo determinada. Consulte Prácticas recomendadas para trabajar con la limpieza automática de PostgreSQL para obtener sugerencias sobre cómo determinar la configuración de limpieza automática adecuada. Utilice la utilidad postgres_get_av_diag para supervisar los problemas relacionados con el crecimiento de ID de transacción.

Impacto: actualización de la versión principal/pg_dump y restauración

Amazon RDS utiliza la opción “--link” durante la ejecución de pg_upgrade para evitar tener que hacer copias de los archivos de datos. Aun así, es necesario restaurar los metadatos del esquema en la nueva versión de la base de datos. Incluso con pg_restore paralelo, si hay un número significativo de relaciones, esto aumentará la cantidad de tiempo de inactividad.

Impacto: degradación general del rendimiento

Degradación general del rendimiento debido al tamaño del catálogo. Cada tabla y sus columnas asociadas se agregarán a las tablas de pg_attribute, pg_class y pg_depend que se utilizan con frecuencia en las operaciones normales de la base de datos. No habrá ningún evento de espera específico visible, pero la eficiencia del búfer compartido se verá afectada.

Acción recomendada: compruebe con regularidad la sobrecarga de la tabla para estas tablas específicas y, de vez en cuando, realice una operación VACUUM FULL en estas tablas específicas. Tenga en cuenta que VACUUM FULL en las tablas del catálogo requiere un bloqueo ACCESS EXCLUSIVE, lo que significa que ninguna otra consulta podrá acceder a ellas hasta que se complete la operación.

Impacto: agotamiento de los descriptores de archivos

Error: “No hay suficientes descriptores de archivos: hay demasiados archivos abiertos en el sistema; libérelos y vuelva a intentarlo”. El parámetro max_files_per_process de PostgreSQL determina cuántos archivos puede abrir cada proceso. Si hay un número elevado de conexiones que se unen a un número elevado de tablas, es posible alcanzar este límite.

Acción recomendada:

  • La reducción del valor del parámetro max_files_per_process puede ayudar a solventar este error. Cada proceso y subproceso (por ejemplo, una consulta paralela) puede abrir este número de archivos y, si las consultas unen varias tablas, este límite puede agotarse.

  • Reduzca el número total de conexiones y utilice un agrupador de conexiones como Amazon RDS Proxy u otras soluciones como PgBouncer. Para obtener más información, consulte el sitio web de PgBouncer.

Impacto: agotamiento de inodos

Error: “Falta de espacio en el dispositivo”. Si esto se observa cuando hay suficiente espacio libre de almacenamiento, se debe a que se están agotando los inodos. La Supervisión mejorada de Amazon RDS proporciona visibilidad de los inodos en uso y del número máximo disponible para el host.

Umbral aproximado: millones

Tablas temporales

El uso de tablas temporales es útil para datos de prueba o resultados intermedios y es un patrón común que se observa en muchos motores de bases de datos. Hay que entender las implicaciones del uso intensivo de PostgreSQL para evitar algunas de las dificultades. Cada tabla temporal creada y eliminada agregará filas a las tablas del catálogo del sistema, lo que, cuando se sobrecargue, provocará problemas generales de rendimiento.

Impacto: la limpieza automática se queda atrás

Las tablas temporales no se aspiran con limpieza automática, sino que conservan los ID de las transacciones durante su existencia y, si no se retiran, pueden quedar ocultas.

Acción recomendada: las tablas temporales permanecerán activas mientras dure la sesión en la que se crearon o se pueden eliminar manualmente. Una práctica recomendada consiste en evitar las transacciones de larga duración con tablas temporales para evitar que estas tablas contribuyan al máximo crecimiento de los ID de transacción utilizados.

Impacto: degradación general del rendimiento

Degradación general del rendimiento debido al tamaño del catálogo. Cuando las sesiones crean y descartan tablas temporales de forma continua, se agregan a tablas de pg_attribute, pg_class y pg_depend que se utilizan con frecuencia en las operaciones normales de la base de datos. No habrá ningún evento de espera específico visible, pero la eficiencia del búfer compartido se verá afectada.

Acción recomendada:

  • compruebe con regularidad la sobrecarga de la tabla para estas tablas específicas y, de vez en cuando, realice una operación VACUUM FULL en estas tablas específicas. Tenga en cuenta que VACUUM FULL en las tablas del catálogo requiere un bloqueo ACCESS EXCLUSIVE, lo que significa que ninguna otra consulta podrá acceder a ellas hasta que se complete la operación.

  • Si se utilizan mucho las tablas temporales, antes de actualizar una versión principal, se recomienda encarecidamente utilizar una operación VACUUM FULL de estas tablas de catálogo específicas para reducir el tiempo de inactividad.

Prácticas recomendadas generales:

  • reduzca el uso de tablas temporales mediante el uso de expresiones de tablas comunes para obtener resultados intermedios. A veces, esto puede complicar las consultas necesarias, pero se eliminarán los impactos mostrados anteriormente.

  • Reutilice las tablas temporales mediante el comando TRUNCATE para borrar el contenido en lugar de realizar los pasos de eliminar o crear. Esto también eliminará el problema del crecimiento del ID de transacción provocado por las tablas temporales.

Umbral aproximado: decenas de miles

Tablas sin registrar

Las tablas no registradas pueden ofrecer mejoras de rendimiento, ya que no generarán ninguna información de WAL. Se deben usar con cuidado, ya que no ofrecen durabilidad durante la recuperación de un error de la base de datos, ya que se truncarán. Esta es una operación costosa en PostgreSQL, ya que cada tabla no registrada se trunca en serie. Aunque esta operación es rápida para un número reducido de tablas sin registrar, cuando se cuentan por miles, puede empezar a provocar un retraso notable durante el inicio.

Impacto: replicación lógica

Por lo general, las tablas no registradas no se incluyen en la replicación lógica, como implementaciones azul/verde, porque la replicación lógica se basa en WAL para capturar y transferir los cambios.

Impacto: tiempo de inactividad prolongado durante la recuperación

Durante cualquier estado de la base de datos que implique la recuperación de errores de la base de datos, como el reinicio multi-AZ con conmutación por error, la recuperación en un momento dado de Amazon RDS y la actualización de la versión principal de Amazon RDS, se producirá la operación serializada de truncar las tablas no registradas. Esto puede provocar un tiempo de inactividad mucho mayor de lo esperado.

Acción recomendada:

  • minimice el uso de tablas no registradas solo para los datos cuya pérdida es aceptable durante las operaciones de recuperación tras un error de la base de datos.

  • Minimice el uso de tablas no registradas, ya que el comportamiento actual del truncamiento en serie puede provocar que el inicio de una base de datos tarde mucho tiempo.

Prácticas recomendadas generales:

  • Las tablas no registradas no son a pruebas de errores. En PostgreSQL, iniciar una recuperación en un momento dado, que implica una recuperación por error, lleva mucho tiempo, ya que se trata de un proceso en serie que trunca cada tabla.

Umbral aproximado: miles

Particiones

El particionamiento puede aumentar el rendimiento de las consultas y proporcionar una organización lógica de los datos. En situaciones ideales, el particionamiento se organiza de manera que se pueda utilizar la depuración de particiones durante la planificación y ejecución de las consultas. El uso de demasiadas particiones puede tener un impacto negativo en el rendimiento de las consultas y en el mantenimiento de la base de datos. La elección de cómo particionar una tabla debe hacerse con cuidado, ya que un diseño deficiente puede afectar negativamente al rendimiento de la planificación y ejecución de las consultas. Consulte la documentación de PostgreSQL para obtener más información sobre las particiones.

Impacto: degradación general del rendimiento

A veces, la sobrecarga de tiempo de planificación aumentará y la explicación de los planes para las consultas se volverá más complicada, lo que dificultará la identificación de las oportunidades de ajuste. En el caso de las versiones de PostgreSQL anteriores a la 18, muchas particiones con una gran carga de trabajo pueden provocar esperas de LWLock:LockManager.

Acción recomendada: determine un número mínimo de particiones que permita completar la organización de los datos y, al mismo tiempo, ejecutar las consultas de forma eficaz.

Impacto: complejidad del mantenimiento

Un número muy elevado de particiones provocará dificultades de mantenimiento, como la creación previa y la eliminación. La limpieza automática tratará las particiones como si fueran relaciones normales y tendrá que realizar una limpieza periódica, por lo que necesitará un número suficiente de trabajadores para completar la tarea.

Acción recomendada:

  • asegúrese de crear previamente las particiones para que la carga de trabajo no se bloquee cuando se necesite una nueva partición (por ejemplo, particiones mensuales) y se eliminen las particiones antiguas.

  • Asegúrese de tener suficientes trabajadores de limpieza automática para llevar a cabo la limpieza y el mantenimiento normales de todas las particiones.

Umbral aproximado: cientos

Archivos temporales

A diferencia de las tablas temporales mencionadas anteriormente, PostgreSQL crea los archivos temporales cuando una consulta compleja puede realizar varias operaciones de ordenación y hash al mismo tiempo, y cada una de ellas utiliza memoria de la instancia para almacenar los resultados hasta el valor especificado en el parámetro work_mem. Cuando la memoria de la instancia no es suficiente, se crean archivos temporales para almacenar los resultados. Consulte Administración de archivos temporales para obtener más información sobre los archivos temporales. Si la carga de trabajo genera un número alto de estos archivos, puede haber varios impactos.

Impacto: agotamiento de los descriptores de archivos

Error: “No hay suficientes descriptores de archivos: hay demasiados archivos abiertos en el sistema; libérelos y vuelva a intentarlo”. El parámetro max_files_per_process de PostgreSQL determina cuántos archivos puede abrir cada proceso. Si hay un número elevado de conexiones que se unen a un número elevado de tablas, es posible alcanzar este límite.

Acción recomendada:

  • La reducción del valor del parámetro max_files_per_process puede ayudar a solventar este error. Cada proceso y subproceso (por ejemplo, una consulta paralela) puede abrir este número de archivos y, si las consultas unen varias tablas, este límite puede agotarse.

  • Reduzca el número total de conexiones y utilice un agrupador de conexiones como Amazon RDS Proxy u otras soluciones como PgBouncer. Para obtener más información, consulte el sitio web de PgBouncer.

Impacto: agotamiento de inodos

Error: “Falta de espacio en el dispositivo”. Si esto se observa cuando hay suficiente espacio libre de almacenamiento, se debe a que se están agotando los inodos. La Supervisión mejorada de Amazon RDS proporciona visibilidad de los inodos en uso y del número máximo disponible para el host.

Prácticas recomendadas generales:

  • Supervise el uso de los archivos temporales con Información de rendimiento.

  • Ajuste las consultas que generan archivos temporales importantes para ver si es posible reducir el número total de archivos temporales.

Umbral aproximado: miles

Secuencias

Las secuencias son el objeto subyacente que se utiliza para incrementar automáticamente las columnas en PostgreSQL y proporcionan exclusividad y una clave para los datos. Se pueden usar en tablas individuales sin consecuencias durante las operaciones normales, con una excepción de la replicación lógica.

En PostgreSQL, la replicación lógica actualmente no replica el valor actual de una secuencia a ningún suscriptor. Para obtener más información, consulte Página de restricciones en la documentación de PostgreSQL.

Impacto: se prolongó el tiempo de conmutación

Si planea usar Implementaciones azules/verdes de Amazon RDS para cualquier tipo de cambio o actualización de configuración, es importante que comprenda el impacto de un gran número de secuencias en la conmutación. Una de las últimas fases de la conmutación sincronizará el valor actual de las secuencias y, si hay varios miles, aumentará el tiempo total de conmutación.

Acción recomendada: si la carga de trabajo de la base de datos permitiera el uso de un UUID compartido en lugar de un enfoque de secuencia por tabla, esto reduciría el paso de sincronización durante una conmutación.

Umbral aproximado: miles

Objetos grandes

Los objetos grandes se almacenan en una sola tabla del sistema llamada pg_largeobject. Cada objeto grande también tiene una entrada en la tabla del sistema pg_largeobject_metadata. Estos objetos se crean, modifican y limpian de forma muy diferente a las relaciones estándar. Los objetos grandes no se manipulan con limpieza automática y deben limpiarse periódicamente mediante un proceso independiente llamado vacuumlo. Consulte la sección sobre administración de objetos grandes con el módulo lo para ver ejemplos sobre la administración de objetos grandes.

Impacto: replicación lógica

Los objetos grandes no se replican actualmente en PostgreSQL durante la replicación lógica. Para obtener más información, consulte Página de restricciones en la documentación de PostgreSQL. En una configuración azul/verde, esto significa que los objetos grandes del entorno azul no se replican en el entorno verde.

Impacto: actualización a la versión principal

Una actualización puede quedarse sin memoria y fallar si hay millones de objetos grandes y la instancia no puede gestionarlos durante una actualización. El proceso de actualización a la versión principal de PostgreSQL consta de dos amplias fases: el volcado del esquema a través de pg_dump y la restauración de este a través de pg_restore. Si su base de datos tiene millones de objetos de gran tamaño, debe asegurarse de que la instancia tenga memoria suficiente para gestionar pg_dump y pg_restore durante una actualización y escalarla a un tipo de instancia más grande.

Prácticas recomendadas generales:

  • Use regularmente la utilidad vacuumlo para eliminar cualquier objeto grande huérfano que pueda tener.

  • Considere la posibilidad de utilizar el tipo de datos BYTEA para almacenar los objetos grandes en la base de datos.

Umbral aproximado: millones

Umbrales aproximados

Los umbrales aproximados que se mencionan en este tema solo se utilizan para proporcionar una estimación de hasta qué punto puede escalar un recurso en particular. Representan el rango general en el que los impactos descritos son más probables, pero el comportamiento real depende de la carga de trabajo, el tamaño de la instancia y la configuración específicos. Aunque es posible superar estas estimaciones, se deben respetar los cuidados y el mantenimiento para evitar los impactos mostrados.