Predicción del Crecimiento del Almacenamiento
Las sorpresas en el disco detienen las escrituras: el crecimiento de tablas e índices, la hinchazón, la retención de WAL de las ranuras de replicación y los artefactos de copia de seguridad consumen bytes. Predice el crecimiento mensual a partir de las tasas de inserción medidas y el estado de autovacuum, no de una suposición inicial de aprovisionamiento.
Receta
-- Tamaños de la base de datos y de las tablas principales
SELECT pg_size_pretty(pg_database_size(current_database())) AS db_total;
SELECT relname,
pg_size_pretty(pg_total_relation_size(relid)) AS total,
pg_size_pretty(pg_relation_size(relid)) AS heap,
n_live_tup,
n_dead_tup
FROM pg_stat_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 15;-- Tamaño del directorio WAL (autoalojado)
SELECT count(*) AS wal_files,
pg_size_pretty(sum(size)) AS wal_bytes
FROM pg_ls_waldir();Cuándo usar esto:
- Presupuesto anual para el autoscale máximo de almacenamiento de RDS
- Incidente de hinchazón después de una eliminación masiva o un vacuum fallido
- Alerta de presión de disco de ranura de replicación
Ejemplo de Trabajo
Predice el crecimiento a 90 días para la tabla de solo anexión events.
-- Tamaño actual
SELECT pg_relation_size('events') AS bytes,
pg_size_pretty(pg_relation_size('events')) AS pretty;
-- Tasa de inserción diaria (de estadísticas o métricas de la aplicación)
SELECT relname, n_tup_ins, n_tup_upd, n_tup_del, last_autovacuum
FROM pg_stat_user_tables
WHERE relname = 'events';
-- Predicción aproximada: avg_row_bytes × daily_inserts × 90
-- Medir fila promedio:
SELECT avg(pg_column_size(e)) AS avg_row_bytes FROM events e TABLESAMPLE SYSTEM (1);-- Ratio de sobrecarga de índices
SELECT indexrelname,
pg_size_pretty(pg_relation_size(indexrelid)) AS idx_size
FROM pg_stat_user_indexes
WHERE relname = 'events';# Modelo de hoja de cálculo (conceptual)
# daily_new_bytes = inserts_per_day * (avg_row + index_factor)
# index_factor a menudo 0.3-1.0 dependiendo de los índices
# añadir 25% de margen para hinchazón si autovacuum es marginalLo que esto demuestra:
- Tamaño del heap + índices =
pg_total_relation_size n_dead_tupseñala riesgo de hinchazón después de actualizaciones masivas- Tamaño de WAL separado de los datos del usuario - monitorizar ranuras
pg_column_sizemuestreado estima el crecimiento de filas
Análisis Profundo
Componentes de Crecimiento
| Componente | Conductor |
|---|---|
| Inserciones de Heap | Tasa de eventos de negocio |
| Índices | Un btree por índice ~ ancho de clave × filas |
| TOAST | Columnas grandes JSON/texto |
| Hinchazón | Tuplas muertas no vaciadas |
| WAL en disco | max_wal_size, retraso de ranuras de replicación |
| Archivos temporales | Desbordamientos de ordenación/hash a disco |
Detección de Hinchazón
SELECT schemaname, relname, n_live_tup, n_dead_tup,
round(100.0 * n_dead_tup / NULLIF(n_live_tup + n_dead_tup, 0), 2) AS dead_pct
FROM pg_stat_user_tables
WHERE n_dead_tup > 100000
ORDER BY n_dead_tup DESC;pgstattuple o pg_squeeze para un porcentaje de hinchazón profundo en tablas sospechosas.
Retención de WAL de Ranuras de Replicación
SELECT slot_name, slot_type, active,
pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained_wal
FROM pg_replication_slots;Una ranura inactiva con WAL retenido grande es un incidente de disco esperando a suceder.
Autoscale Gestionado
Establece un techo máximo de almacenamiento asignado en RDS; alerta al 80% de la asignación actual.
Errores Comunes
- Autoscale sin techo - factura descontrolada. Solución: límite máximo + paginación al 85% de uso.
- Eliminación masiva sin plan de vacuum - el disco no se reduce; la hinchazón crece. Solución: programa
VACUUM (ANALYZE); eliminaciones de particiones para archivo. - Actualización olvidada de staging - copia de producción duplica el disco en entornos no productivos. Solución: subconjunto de datos de staging.
- Explosión de índices - cada nueva columna de filtro añade bytes permanentes. Solución: índices parciales, eliminar los no utilizados a través de
idx_scanenpg_stat_user_indexes. - Ranura de replicación lógica en primario ocupado - WAL retenido hasta que el consumidor se ponga al día. Solución: monitorizar bytes de retraso de ranura; eliminar ranuras obsoletas.
- Predicción solo por recuento de filas - filas JSON anchas difieren 10x. Solución: muestrear
pg_column_size.
Alternativas
| Alternativa | Usar Cuándo | No Usar Cuándo |
|---|---|---|
| Particionamiento de tablas por tiempo | Eventos de anexión pesada | Tablas de dimensión pequeñas |
| Archivo a almacenamiento en frío | Años de retención de cumplimiento | Necesidad de consulta instantánea de todo el historial |
| pg_repack / pg_squeeze | Hinchazón sin bloqueo prolongado | Ventana de mantenimiento no disponible (planificar de todos modos) |
| Tablespace separado en disco rápido | División caliente vs fría | Complejidad operativa no deseada |
Preguntas Frecuentes
¿Con qué frecuencia predecir?
Mensualmente para productos de crecimiento rápido; trimestralmente para OLTP estable.
¿DELETE libera disco?
Marca tuplas muertas; se necesita VACUUM FULL o repack para devolver espacio al SO; autovacuum reutiliza internamente.
¿Tamaño de WAL normal?
Limitado por max_wal_size en el primario a menos que las ranuras retengan; investigar GB+ retenidos.
¿Crecimiento de TOAST?
Los grandes blobs JSON dominan; considerar un almacén de objetos externo para blobs > pocos KB.
¿Crecimiento de índices solamente?
Reindexar índices no utilizados; índices parciales para consultas filtradas.
¿Disco de Cloud SQL?
Redimensionamiento automático con alerta; aumento manual para crecimiento predecible por pasos.
¿Almacenamiento de pg_dump?
Incluir el crecimiento del bucket de copia de seguridad en la previsión financiera; comprimir formato personalizado.
¿Alerta de disco al 90% es suficiente?
Sí para página; advertencia del 85% da tiempo antes de que se detengan las escrituras en algunas plataformas.
¿Partición drop vs delete?
DROP PARTITION recuperación instantánea de espacio vs millones de filas DELETE hinchazón.
¿Quién es el responsable de la hoja de cálculo de predicción?
DBA/plataforma con aportaciones del producto sobre el multiplicador esperado de crecimiento de usuarios.
Relacionado
- Conceptos Básicos de Capacidad - I/O y RAM
- Ranuras de Replicación - Retención de WAL
- Trampas de Particionamiento - patrón de archivo
- Disco Lleno en pgdata - runbook de incidentes
- Mejores Prácticas de Planificación de Capacidad - cadencia de revisión
Versiones de la pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.