- La versión beta incorpora
REPACK CONCURRENTLYen el núcleo para bases de datos de producción a gran escala, además de mejoras amplias en consultas de grafos de propiedades SQL, replicación lógica, VACUUM, rendimiento y más - El soporte para fusionar y dividir particiones, junto con la sincronización de valores de secuencia, facilita mucho más los cambios de diseño y el movimiento de datos en sistemas en operación
- Se introducen workers paralelos y un sistema de puntuación por prioridad en autovacuum, mejorando el rendimiento y la visibilidad de las tareas de mantenimiento
- Con SQL/PGQ, ahora es posible consultar datos existentes en forma de grafo sin abandonar el modelo relacional
- La clave no es una sola función destacada, sino la amplitud (breadth): avances simultáneos en aplicaciones, operaciones, rendimiento y escalabilidad
REPACK integrado por defecto
- En entornos de operación de largo plazo, se repite con frecuencia la necesidad de recuperar bloat de tablas, reescribir tablas o reorganizar datos sin sufrir los bloqueos que traen
VACUUM FULLoCLUSTER- Ya existía un ecosistema de extensiones para resolver este problema, y
pg_repackfue uno de los ejemplos más representativos
- Ya existía un ecosistema de extensiones para resolver este problema, y
- Postgres 19 incorpora el comando
REPACKal núcleo, incluyendo soporte paraREPACK CONCURRENTLY- Se espera que sea una función más relevante para usuarios de producción de lo que suele anticipar el lector promedio de las notas de lanzamiento
Más utilidad práctica para el particionamiento
- Postgres 19 añade soporte para fusionar y dividir particiones
- Las estrategias de particionamiento suelen elegirse con información incompleta, y cuando cambian la carga, la retención o la velocidad de crecimiento de los datos, algunas particiones pueden volverse demasiado grandes o demasiado pequeñas
- Al poder dividir y fusionar, se gana margen para hacer evolucionar el diseño con el tiempo sin tener que reconstruir todo desde cero
- Ejemplo de fusionar las particiones Q1 y Q2 en una sola:
ALTER TABLE customer_orders MERGE PARTITIONS (orders_2026_q1, orders_2026_q2) INTO orders_2026_h1; - También se muestra un ejemplo de
SPLIT PARTITIONpara dividir la partición de Q3 por mes
- Ejemplo de fusionar las particiones Q1 y Q2 en una sola:
La madurez de la replicación lógica
- La replicación lógica es útil para migraciones, upgrades, sistemas de reporting, movimiento de datos, replicación selectiva y flujos operativos o de alta disponibilidad
- La mejora más importante es la sincronización de valores de secuencia, que hace que el suscriptor quede mucho más alineado con el publicador
- Si se replica sin el estado de las secuencias, los datos se mueven, pero después del cutover aparecen problemas porque el siguiente ID generado no coincide
- Se añade soporte para
ALL SEQUENCESen la publicación, reporte de errores de sincronización de secuencias y mejoras en el comportamiento de actualización de suscripciones relacionadas con secuencias
- Ahora se puede usar la cláusula
EXCEPTpara publicar todas las tablas salvo algunas específicas - Si hace falta
wal_level = replica, la replicación lógica se activa automáticamente, y además se incorporaeffective_wal_levelpara reportar el comportamiento real, reduciendo errores de configuración y mejorando la visibilidad
Autovacuum más inteligente y más visible
- Autovacuum puede usar workers de vacuum paralelos, con control tanto global como por tabla
- Ejemplo de configuración global:
ALTER SYSTEM SET autovacuum_max_parallel_workers = 4;
- Ejemplo de configuración global:
- Se introduce un nuevo sistema de puntuación para controlar el orden en que se hace vacuum sobre las tablas, mejorando la priorización de cuáles requieren atención más urgente
- Ejemplo de ajuste por tabla: urgencia 3.0 para vacuum basado en inserts y urgencia 0.5 para vacuum normal por updates/deletes
- La nueva vista
pg_stat_autovacuum_scoresda visibilidad al proceso de toma de decisiones- También se refuerza la observabilidad del mantenimiento con más detalle en las vistas de progreso de vacuum y analyze, uso de memoria y paralelismo en
VACUUM VERBOSEy en los logs de autovacuum, además de un nuevolog_autoanalyze_min_duration
- También se refuerza la observabilidad del mantenimiento con más detalle en las vistas de progreso de vacuum y analyze, uso de memoria y paralelismo en
Llegan las consultas de grafos de propiedades SQL
- Se agrega SQL/PGQ (SQL property graph queries)
- Se mencionan cargas donde el modelo de vértices y aristas resulta útil, como detección de fraude, recomendaciones, análisis de redes, grafos de permisos, cadenas de suministro y organigramas
- Se muestra un ejemplo de definición de grafo de propiedades con
CREATE PROPERTY GRAPH store_graph, indicandoVERTEX TABLESyEDGE TABLES
- La idea no es abandonar el modelo relacional, sino sumar otra forma de consultar datos que ya existen
- Va en la misma línea de JSONB, búsqueda de texto completo y extensiones, que no obligaron a cambiar la arquitectura existente
- Desde la perspectiva del desarrollador, esto permite usar consultas de tipo grafo sin sumar otro datastore, rutas de sincronización, superficie operativa ni más cosas que depurar a las 2 a. m.
COPY ahora es más útil
COPY FROMahora puede omitir varias líneas de encabezado- Esto sirve para procesar CSV exportados por proveedores, herramientas internas o sistemas que agregan líneas extra de metadatos al inicio
COPY FROMsumaON_ERROR SET_NULL, que permite convertir entradas inválidas en null, ofreciendo una opción intermedia entre “fallar toda la carga” y “limpiar todo previamente”- Se muestra un ejemplo de carga de un archivo donde la columna price mezcla valores como 'N/A' y 'MISSING'
COPY TOpuede emitir JSON, incluyendo un solo arreglo JSON, y también exportar directamente tablas particionadas (antes hacía faltaCOPY (SELECT ...))- Ejemplo para exportar una tabla como un arreglo JSON válido:
WITH (FORMAT JSON, ARRAY true)
- Ejemplo para exportar una tabla como un arreglo JSON válido:
Mejoras de comodidad en SQL
- Con
GROUP BY ALL, las expresiones de la lista que no son agregadas ni de ventana se agrupan automáticamente, haciendo más limpias las consultas SQL exploratorias y de reporting - Las funciones de ventana ahora soportan
IGNORE NULLSyRESPECT NULLSenlead,lag,first_value,last_valueynth_value - Se añade
INSERT ... ON CONFLICT DO SELECT ... RETURNING, lo que permite devolver más directamente la fila en conflicto dentro de un upsert - También se agregan
UPDATEyDELETE FOR PORTION OF, ampliando el soporte para operaciones temporales, junto con una versión extendida de la función temporalRANDOM()
Mejoras generales de rendimiento
- Hay múltiples mejoras en el planner y el ejecutor: anti-join, semi-join, constant folding, incremental sort en rutas append, agregación antes del join, cálculo de selectividad en joins, estadísticas de funciones y más
- Postgres sigue avanzando en reconocer mejor formas comunes de consulta y reducir trabajo innecesario
- Parte de la agregación ahora puede ejecutarse antes del join para reducir la cantidad de filas procesadas
- Más casos de
NOT INyLEFT JOINpueden transformarse en anti-joins eficientes - También mejora la visibilidad de Memoize en
EXPLAIN, el rendimiento de ordenamiento con radix sort, la velocidad de verificación de restricciones de clave foránea y el uso de instrucciones SIMD en entradas de texto y CSV deCOPY FROM
- En muchos casos, basta con hacer el upgrade para obtener mejoras sin cambiar el código de la aplicación
Por qué importa Postgres 19
- Lo más llamativo no es una sola función, sino su amplitud (breadth)
- Para desarrolladores de aplicaciones: consultas de grafos, sintaxis SQL mejorada, mejoras en funciones de ventana y mejor comportamiento de upsert
- Para operadores:
REPACK CONCURRENTLY, autovacuum mejorado, monitoreo más completo, cambio de checksums en línea y mayor visibilidad de la replicación - Para usuarios enfocados en rendimiento: mejoras del planner, optimizaciones SIMD, visibilidad de I/O asíncrono, validación más rápida de claves foráneas y mejores ordenamientos
- Para quienes construyen sobre Postgres: nuevos hooks, módulo de asesoría del planner, mejoras en extensiones, consulta de estadísticas de FDW y continuidad en la inversión del ecosistema de extensiones
- No evoluciona solo para una carga o perfil específico, sino al mismo tiempo como base de datos y plataforma para aplicaciones, operaciones, análisis y extensibilidad
- Aún no es GA, así que este es el momento de probar: ejecutar aplicaciones, validar migraciones, revisar extensiones, comprobar planes de consulta clave y evaluar flujos de replicación lógica y mantenimiento
1 comentarios
Opiniones de Hacker News
He usado Postgres, Oracle, MS SQL Server y MySQL en proyectos reales, y aunque no he usado SQLite a fondo, sé que es una excelente opción.
Hoy en día, por mi cuenta, siempre evito Oracle y MySQL/MariaDB.
Postgres es excelente, pero me gustaría que tuviera conexiones livianas y vistas materializadas con actualización sincrónica. Aunque los connection poolers mejoran la situación, el uso de memoria por conexión concurrente sigue siendo anormalmente alto, y una función como las vistas indexadas de SQL Server permite implementaciones elegantes, triviales y siempre correctas en escenarios de datos complejos.
SQL Server puede ser caro, pero en muchos casos vale lo que cuesta, y elegir con cuidado el almacén de datos puede reducir muchos dolores de cabeza futuros.
Si vas a usar un proveedor gratuito, es difícil superar a SQLite, y hoy cubre la mayoría de los casos de uso. Pero empieza a quedarse corto en backups, replicación y herramientas. Si tengo que hacerme responsable de la disponibilidad del sistema y de la recuperación ante desastres, no tengo problema en gastar dinero para reducir el riesgo.
Si voy a pagar aunque sea un poco, voy hasta el final. La experiencia de desarrollo alrededor de MSSQL no tiene comparación, y creo que SSMS y los proyectos SQL de Visual Studio son mucho mejores que las opciones tipo Entity Framework de hoy. Si sumas herramientas de terceros como RedGate, pueden reemplazar paquetes de consultoría de millones de dólares.
No propondría levantar un servidor nuevo de Oracle o DB2, pero si ya existe, probablemente me opondría hasta el final a refactorizar para eliminarlo. Estas bases de datos suelen venir con enormes historias de terror, y si no hay otra opción que reproducir esos efectos secundarios extraños en un motor nuevo, el negocio mismo puede romperse.
Como DBA, cuando haces mucho trabajo pesado de DBA, Postgres está en otra categoría frente a SQL Server. Postgres es nativo de Linux y open source, así que su flexibilidad, observabilidad interna y operabilidad no tienen comparación con SQL Server.
En el panorama tecnológico actual, considero que SQL Server está básicamente muerto. Las empresas que lo usan son organizaciones legacy centradas en Windows, y esas también son cada vez menos.
También estaría bueno tener una opción de actualización diferida. Sería una forma de procesar varias actualizaciones de una vez considerando solo los registros que cambiaron desde el último refresh; no sé bien cómo lo hace Oracle técnicamente. Esta función sería una adición fantástica frente a casi cualquier base de datos OLTP open source.
También me interesa mucho el proyecto OrioleDB: https://github.com/orioledb/orioledb/releases
Hace unos años sufrí bastante con vacuum por muchas inserciones y eliminaciones aleatorias continuas en algo parecido a tablas temporales. Lo resolví acumulando más cambios en RAM y luego haciendo flush a la tabla para aumentar la cantidad de filas modificadas por página, pero me costó mucho encontrar un buen equilibrio.
Como alguien que ha usado Postgres durante más de 15 años en el ámbito científico, me empieza a preocupar que PostgreSQL no tenga almacenamiento orientado a columnas.
A medida que los datasets crecen, las limitaciones del almacenamiento de PG se sienten cada vez más. Varias extensiones como cetus pueden ofrecer esa funcionalidad, pero entonces dependes de que esa extensión siga teniendo soporte en el futuro y además aumenta la complejidad.
Al principio pensé que, si usábamos tablas de Postgres como almacenamiento y el ejecutor de Postgres, el overhead intrínseco sería demasiado alto, así que igualar el rendimiento de Timescale ya sería bastante interesante. No pensaba que pudiera acercarse a una base de datos analítica dedicada.
Pero a medida que avanzó el proyecto, el rendimiento siguió mejorando, y ahora apoyo claramente la idea de hacer trabajos analíticos con Postgres + una extensión.
Es parecido a preocuparse porque Apple no venda lavadoras.
Hoy en día muchas empresas usan en su aplicación principal una base de datos relacional junto con una base de datos clave-valor o un almacén de documentos.
No sé por qué no se habló de que PostgreSQL 19 introduce soporte nativo para datos temporales de application-time basado en el estándar SQL:2011: https://www.depesz.com/2026/04/02/waiting-for-postgresql-19-...
_archive: https://www.postgresql.org/docs/current/tcn.htmlSi esto se vuelve nativo, creo que será realmente excelente, como la mayoría de las implementaciones de PostgreSQL
https://news.ycombinator.com/item?id=48413655
No sé si este artículo usa un estilo sobrerrepresentado en los datos de entrenamiento de los LLM, o si se usó mucho AI para pulirlo. Me inclino por lo segundo
Creo que cuando Claude escribe frases como “como alguien que ha trabajado mucho tiempo en X”, eso es una especie de fallo de alineación. Un LLM no debería escribir como si tuviera experiencia personal. Puede que en los datos de entrenamiento haya personas hablando así, pero aunque sea una secuencia de tokens estadísticamente plausible, creo que un LLM no debería afirmar experiencias de vida que no tiene
Me gustan las mejoras en COPY y la replicación lógica. Actualmente respaldo una base de datos PG en una instancia sidecar de Databasus, y eso pesa más que todo el backend + la DB + Caddy
Lo siguiente es una queja sobre el estilo de LLM
Si Orwell viviera hoy, quizá habría declarado su analfabetismo en inglés y aprendido klingon antes que leer frases como “Eso por sí solo nos dice algo: los usuarios tenían una necesidad real y el ecosistema llenó el vacío”, “Parece simple, pero resuelve problemas reales de operación”, o “No va a cambiar el mundo, pero mejora los flujos de trabajo diarios con datos”
Las funciones de base de datos de grafos se ven interesantes, pero la sintaxis de
GRAPH_TABLEes espantosaSELECT customer_name FROM GRAPH_TABLE (myshop MATCH (c IS customers)-[IS customer_orders]->(o IS orders WHERE o.ordered_when = current_date) COLUMNS (c.name AS customer_name));Esto recuerda a neo4j, pero no creo que sea algo que una herramienta seria de 2026 deba copiar tal cual
Al final, lo que me da curiosidad es la velocidad. La seguridad a nivel de fila es una función muy útil, pero intentar construir algo serio con la implementación de Postgres es imprudente. El planner se descompone y termina haciendo matching por cada fila, destrozando el rendimiento
Es SQL/PGQ, derivado del lenguaje Cypher de Neo4J y ahora parte del estándar SQL
Me gustaría que PostgreSQL incorporara no solo compresión de filas, sino también compresión de bloques. La compresión de filas por sí sola tiene un efecto demasiado limitado
Se puede poner los datos en un pool ZFS y activar la compresión de bloques, pero si hubiera soporte nativo se reduciría la carga de configuración y quizá el rendimiento sería mejor
GROUP BY ALL tiene muchísimo sentido cuando lo piensas, y me parece curioso no haberlo considerado nunca antes
Desde una perspectiva más cercana a DevOps, me gustaría que PostgreSQL por fin admitiera actualizaciones in-place entre versiones mayores consecutivas
La mayoría de las distribuciones pueden lidiar con la molesta característica de ejecutar juntas la versión vieja y la nueva para
pg_upgrade, pero con Docker actualizar a una nueva versión mayor es realmente dolorosoMe alegra que se introduzca GROUP BY ALL. Que yo sepa, es un concepto que introdujo DuckDB
La documentación de DuckDB también dice que varias funciones se introdujeron primero en DuckDB, y que funciones como
GROUP BY ALLfueron adoptadas después por otros sistemashttps://duckdb.org/docs/lts/sql/dialect/friendly_sql