Mejores Prácticas para Series Temporales
Cómo Usar Esta Lista
- Aplica al diseñar tablas de métricas, eventos o ingesta de IoT.
- Automatiza los trabajos de partición y retención antes del primer cambio de mes en producción.
- Revisa cuando el volumen de datos se multiplique por 10 o los usuarios de BI se quejen de la latencia de los dashboards.
A - Esquema y Tiempo
- Usa
timestamptzpara todas las marcas de tiempo de eventos. Almacena en UTC; convierte al mostrar. - Incluye el tiempo en las rutas de acceso primarias.
(device_id, ts DESC)patrón común de btree. - Particiona por rango de tiempo en tablas de alto volumen. Mensual o diario según la tasa de ingesta.
- Pre-crea particiones con dos meses de antelación. Usa
cronopg_partman; nunca confíes silenciosamente en la particiónDEFAULT. - Evita
timestamp without time zone. Errores de DST y TZ de sesión (ver escenarios de defectos).
B - Índices y Consultas
- Añade BRIN en
tspara particiones de solo adición. Complementa, no reemplaza, btree para dispositivo+tiempo. - Limita los dashboards a ventanas de tiempo. No uses
SELECTilimitados en el historial sin procesar. - Usa agregados continuos o rollups materializados. Vistas horarias/diarias para tráfico de BI.
- Dirige las consultas de BI de largo alcance al almacén de datos cuando el ADR lo indique. Solo ventana activa de Postgres.
- Ejecuta
EXPLAINen agregados grandes antes de enviarlos. Confirma la eliminación de particiones en los planes.
C - Retención
- Política de retención como código. Partición
DROP TABLEoadd_retention_policyde Timescale. - Prefiere
DROP/DETACHsobreDELETEde millones de filas. Ahorra problemas de vacuum y WAL. - Archiva particiones frías en almacenamiento de objetos antes de eliminarlas si el cumplimiento lo requiere. Usa
DETACHy luego exporta a Parquet. - Documenta la anulación de retención legal. Algunas particiones están congeladas; etiquétalas en la tabla de metadatos.
- Prueba la restauración desde el archivo anualmente. Los datos fríos son inútiles si están corruptos.
D - Operaciones
- Monitoriza fallos en los límites de las particiones. Alerta sobre errores de inserción al final del mes.
- Rastrea el tamaño de tablas e índices por partición. Pronostica el disco antes de que las eliminaciones automáticas sorprendan.
- Ejecuta
ANALYZEdespués de un backfill masivo. El planificador necesita estadísticas por partición hija. - Evalúa Timescale solo a través de la lista de permitidos del ADR. Implicaciones de precarga y licencias.
- Revisa el ADR de descarga de OLAP ante un crecimiento de 10x. Evidencia recopilada por
pg_stat_statements.
Preguntas Frecuentes
¿Cuándo empezar a particionar?
Cuando las consultas por rango de tiempo o las eliminaciones de retención no cumplen los SLO; a menudo con 50 GB+ o una alta tasa de inserción diaria.Partición DEFAULT?
Úsala solo como red de seguridad con monitorización; no como estrategia principal.¿pg_cron para mantenimiento?
Programa la creación/eliminación de particiones y la actualización de MVs; se requiere una lista de permitidos de extensiones.¿Solo BRIN?
No para búsquedas de puntos de dispositivo; sí como ayuda en escaneos solo de tiempo.¿Compresión?
Timescale o un almacén de datos columnar; el TOAST nativo de Postgres no es una estrategia de compresión para series temporales.¿Réplicas de lectura para dashboards?
Sí para la ruta activa; aún se necesitan rollups para escaneos enormes.¿Detección de huecos?
Usa `generate_series` para la continuidad de los gráficos; un trabajo de monitorización separado.¿Métricas multi-inquilino?
Particiona primero por tiempo; luego sub-particiona o usa un índice `tenant_id`.¿Eventos JSONB?
Extrae columnas indexadas; mantén el `jsonb` sin procesar para depuración con TTL.¿Comprobaciones de migración en CI?
Asegura que el DDL de partición y el trabajo de retención estén registrados en la misma versión.Relacionados
- Conceptos Básicos de Series Temporales - partición + BRIN
- TimescaleDB - hypertables
- Agregados Continuos - rollups
- ADR de Descarga de OLAP - ClickHouse/BigQuery
- Mejores Prácticas de Particionamiento de Tablas - higiene de particiones nativas
Versiones de Stack: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PostGIS 3.5+, pgbouncer 1.x, y Patroni 3.x.