Demasiadas tablas pueden agotar la memoria en PostgreSQL

Fuentes: Too many tables are bad for you

Una acumulación excesiva de tablas en una base de datos PostgreSQL puede provocar problemas graves de rendimiento y consumo de memoria, según documenta el consultor Laurenz Albe tras intervenir en un caso real. El síntoma más visible fue la activación del asesino OOM (Out-Of-Memory killer) de Linux, que terminaba procesos del servidor, junto con consultas que consumían CPU durante demasiado tiempo.

Al investigar con volcados de contexto de memoria, el experto identificó que el culpable no eran los parámetros habituales como shared_buffers o work_mem, sino el área CacheMemoryContext. Esta región almacena metadatos de catcache y relcache, es decir, las descripciones de tablas, vistas, índices y demás objetos registrados en pg_class. No tiene tamaño fijo ni límite: crece sin liberarse a medida que una conexión de larga duración referencia más objetos.

Un experimento reproducible lo demuestra: crear 20 000 tablas con 20 columnas cada una apenas ocupa unos pocos megabytes en la caché, pero recorrerlas todas con SELECT eleva el consumo a 221 MB en una sola conexión. Multiplicado por decenas de conexiones persistentes, el total puede agotar la RAM del servidor. Entre las mitigaciones se encuentran diseñar el esquema con menos tablas, dimensionar correctamente el pool de conexiones y configurar idle_session_timeout para liberar sesiones inactivas.