Postgres está lanzando una función nueva e increíble

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

스크립트

00:00:00Así que resulta que todos esos desarrolladores que dicen, oye, usa Postgres para todo, tienen aún más
00:00:04razón con el próximo lanzamiento de Postgres 19, que incluye soporte nativo para consultas de grafos,
00:00:10y esta es una característica genial. Así que en el video de hoy quiero repasar todas las funciones principales
00:00:16de Postgres 19 y también echar un vistazo más profundo a las consultas de grafos específicamente, porque creo que
00:00:21puede cambiar fundamentalmente la forma en que diseñamos nuestras consultas y usamos Postgres.
00:00:30Así que la primera novedad es algo llamado on conflict do select. Si quieres insertar una fila solo si
00:00:35no existe todavía y, de cualquier manera, quieres devolver esa fila como resultado, normalmente necesitarías
00:00:40dos consultas para esto: un insert y un select, y este es un flujo de trabajo muy común. Así que aquí en el ejemplo
00:00:45decimos que vamos a insertar en users email y name, y luego damos esos valores, y luego al
00:00:50final decimos on conflict for email do nothing returning star. Do nothing no te devuelve nada cuando la fila
00:00:56ya existe, así que lo acompañas con un select, pero juntos esto no es atómico. Con la versión 19 puedes hacer esto
00:01:03con una sola consulta. Insert into users dando el email y el name, y luego decimos on conflict email do select
00:01:11returning star. Y si quieres modificar en la misma consulta, podemos decir insert into users y luego damos
00:01:16los valores de nuevo on conflict para el email do select for update returning id and name. Y como es una sola
00:01:23sentencia es atómica, o la insertas o la seleccionas cada vez, y este es un caso de uso tan común que
00:01:29va a ser realmente útil. Lo siguiente son los grafos, pero si estás disfrutando de esto,
00:01:34¿por qué no te suscribes a Better Stack para estar al día con lo último en tecnología? Ahora, como dije antes,
00:01:39esta es la función principal en mi opinión. Digamos que tienes el esquema habitual para una tienda: tienes clientes,
00:01:44pedidos y productos, además de las dos tablas de unión que los conectan a todos, y quieres saber qué
00:01:50producto compró realmente un cliente determinado. En SQL es una cadena de uniones a través de las cinco tablas, y eso
00:01:56es bastante manejable aquí, pero se vuelve bastante feo rápidamente para relaciones más complejas. Bueno, ahora
00:02:02podemos consultar todo esto como un grafo, de modo que esa compleja sintaxis de unión se convierte ahora en una nueva sintaxis de grafo. Y
00:02:08con uniones complejas en particular, vas a ver un beneficio realmente grande aquí. Así que estamos dentro de nuestro visor de base de datos
00:02:14aquí, y puedes ver que tenemos todas nuestras tablas: productos, pedidos, eventos, tenemos
00:02:20clientes también, y luego tenemos las tablas pivote para conectar todos estos datos. Así que tenemos order items
00:02:25y customer orders, y ahora intentemos ejecutar una consulta contra todas estas tablas. Así que por ejemplo,
00:02:30tengo esta usuaria aquí llamada Alice, quiero averiguar todas las cosas que Alice ha pedido. Para hacer
00:02:35esto tendría que pasar por un montón de consultas de unión diferentes para conectar todas esas tablas. Así que ejecutaría esta
00:02:41consulta que tiene cuatro sentencias de unión separadas dentro de ella, y aunque esto no es necesariamente difícil
00:02:46de escribir, es muy feo, pero si ejecutamos esto puedes ver que podemos ver todas las cosas que Alice ha
00:02:51pedido: el teclado mecánico y el ratón ergonómico. Pero ahora podemos usar la sintaxis de grafos para simplificar enormemente
00:02:57esto. Así que reemplazaremos todo esto con la nueva sintaxis de grafos y ejecutaremos esto de nuevo, y puedes
00:03:03ver que obtenemos los mismos resultados, y si alineamos todo esto, empieza a ser más fácil de leer, así que puedes ver
00:03:07que simplemente vamos de customers a customer orders, a orders, a order items, a products. Así que puedes
00:03:13básicamente seguir este flujo simple para atravesar todo el grafo, lo cual, en mi opinión, es mucho, mucho
00:03:19más fácil de leer. Si quieres seleccionar múltiples columnas también, podemos hacerlo; tenemos la misma
00:03:23consulta de grafo en la parte superior aquí, pero luego podemos definir columnas en la parte inferior y luego seleccionamos todas las
00:03:27columnas que queremos mostrar, y al ejecutar eso obtenemos los resultados en la parte inferior. Ahora, nada de esto
00:03:32funcionará a menos que hayamos creado el grafo en primer lugar, así que la consulta que he usado para
00:03:37generar ese grafo está aquí: decimos create property graph y luego le damos un nombre, my shop, y luego
00:03:42delineamos las tablas de vértices, que van a ser customers, orders y products, así que estas son las
00:03:47cosas que realmente contienen los datos, y luego tenemos las tablas de aristas, y estas son las cosas que
00:03:52realmente hacen las conexiones, es decir, las tablas pivote; en nuestro caso, serían customer orders y order
00:03:57items. Y la sintaxis para esto es súper simple: decimos que para customer orders el origen es customers y el
00:04:02destino es orders, y para order items el origen es orders y el destino es products, y con
00:04:08eso en su lugar, Postgres ahora sabrá, cada vez que ejecutemos una consulta de grafo, cómo se definen esas relaciones.
00:04:14Para que esto funcione necesitas crear un grafo, pero esto no crea nuevas tablas ni nada por el estilo,
00:04:19simplemente apuntas a las cinco tablas que ya tienes: las tres que realmente contienen los datos se convierten en
00:04:23vértices y las dos tablas de unión se convierten en las aristas. Funciona mucho más como una vista, por lo que tu esquema anterior
00:04:29permanece completamente sin cambios, solo obtienes esta funcionalidad adicional encima, así que aquí vamos a
00:04:35decir create property graph, lo llamaremos my shop y luego empezamos a describir cómo funciona realmente
00:04:40esa relación, y aquí es donde estamos haciendo todo el trabajo para el grafo, y significa que las consultas
00:04:45pueden ser mucho, mucho más delgadas que su respectiva sintaxis de unión. Entonces, ¿es esto un reemplazo de Neo4j? Bueno, si quieres una
00:04:52base de datos de grafos porque necesitas rendimiento de almacenamiento y recorrido de grafos, entonces no, y una base de datos de grafos
00:04:58dedicada sigue siendo probablemente la mejor opción, pero si quieres esto porque escribir uniones de 10 tablas en
00:05:03SQL es doloroso y feo, entonces definitivamente te va a beneficiar y va a ser mucho más agradable en
00:05:09comparación. La tercera nueva característica es repack, y esta trata sobre recuperar espacio en disco. Postgres
00:05:15nunca actualiza una fila en el lugar, escribe una nueva versión y deja atrás la antigua, y vacuum solo
00:05:21marca ese espacio muerto como reutilizable, por lo que el uso de tu disco nunca baja realmente. Repack reescribe toda la
00:05:27tabla en un archivo nuevo sin nada del espacio desperdiciado en él, y eso es lo que devuelve el espacio al
00:05:33sistema operativo. En realidad ya podías hacer esto con vacuum full, pero eso bloquea la tabla para
00:05:38toda la reescritura, así que para cualquier cosa masiva simplemente nunca lo ejecutas, y por eso la gente instalaba
00:05:42extensiones como pg repack, pero ahora lo tenemos integrado directamente en Postgres. Usa la palabra clave concurrently con
00:05:49esto y mantiene la tabla legible y escribible mientras trabaja repack. Una cosa a tener en cuenta aquí, sin embargo:
00:05:54necesitas suficiente espacio libre en disco para una segunda copia de la tabla y todos sus índices, por lo que necesitas
00:06:00espacio libre para recuperar más espacio, así que esto no es un reemplazo exacto de pg repack, pero para
00:06:06una tabla normal hace el trabajo sin la extensión. Muy bien, ahora vamos a hacer una ronda rápida de
00:06:11las características restantes en la versión 19. Primero están las pistas de consulta (query hints): Postgres decide cómo ejecutar realmente tu
00:06:17consulta y puede cambiar de opinión con el tiempo, por lo que una consulta que ha estado bien durante un año de repente se vuelve lenta
00:06:22y nada en tu código cambió. Un nuevo módulo llamado pg plan advice te permite capturar el plan mientras
00:06:28sigue siendo rápido y fijarlo para que siempre permanezca así. JIT está ahora deshabilitado por defecto: Postgres compila consultas pesadas
00:06:36a código de máquina, pero decidía cuándo molestarse a partir de la estimación de costos del planificador, y las notas de lanzamiento
00:06:41dicen que ese cálculo de costos era en realidad poco confiable, por lo que se activaba en consultas que en realidad no
00:06:46lo necesitaban. Además, vacuum ahora puede limpiar tus índices con varios trabajadores en paralelo, por lo que hay menos tiempo
00:06:52dedicado a limpiar una tabla grande; aunque tienes que activar esto tú mismo. ¿Sabes cuando añades una columna para
00:06:58hacer un select y luego tienes que añadir la misma columna al group by también? Hace todo eso por ti,
00:07:03y la palabra clave copy ahora puede exportar directamente a JSON, así que si has estado volcado CSV y convirtiéndolo
00:07:09después, puedes dejar de hacer eso. Así que esa es Postgres 19 beta 2, que llegó en julio, y el lanzamiento final
00:07:15se espera alrededor de septiembre u octubre, así que si estás ejecutando algo más antiguo, vale la pena descargar la beta
00:07:21y probarla ahora. Y si quieres ver más sobre Postgres, puedes echar un vistazo
00:07:25a un análisis de pg durable, que pone flujos de trabajo duraderos directamente dentro de Postgres. He sido Warren de
00:07:31Better Stack, gracias por ver y nos vemos en la próxima.

핵심 요약

Postgres 19 introduce mejoras significativas de rendimiento y usabilidad, destacando consultas nativas de grafos, operaciones atómicas on conflict do select y repack concurrente.

하이라이트

  • Postgres 19 incluye soporte nativo para consultas de grafos mediante la creación de un grafo de propiedades sobre tablas existentes.

  • La nueva cláusula on conflict do select permite realizar inserciones condicionales y devolver la fila resultante en una sola sentencia atómica.

  • La función repack reescribe tablas completas sin bloquear la lectura ni la escritura utilizando la palabra clave concurrently.

  • El módulo pg plan advice permite fijar planes de consulta para evitar bajadas de rendimiento imprevistas.

  • El comando copy en Postgres 19 exporta datos directamente al formato JSON.

타임라인

Novedades en inserciones y consultas atómicas

  • La sintaxis on conflict do select simplifica flujos de trabajo que antes requerían múltiples consultas.
  • Las operaciones se ejecutan de forma atómica para insertar o seleccionar filas según la existencia previa.

Los flujos habituales de inserción y selección requerían combinar sentencias separadas que no garantizaban atomicidad. La versión 19 resuelve este problema integrando la selección directa dentro de la misma instrucción de conflicto.

Consultas de grafos nativas

  • El comando create property graph define vértices y aristas utilizando tablas relacionales existentes.
  • Las consultas de grafos reemplazan uniones complejas de múltiples tablas con una sintaxis más limpia y legible.

Las relaciones complejas entre clientes, pedidos y productos tradicionalmente requerían cadenas extensas de uniones SQL. La nueva funcionalidad de grafos reutiliza las tablas actuales como vértices y tablas pivote como aristas sin alterar el esquema subyacente.

Recuperación de espacio en disco con repack

  • La función repack reescribe tablas para eliminar espacio muerto y devolverlo al sistema operativo.
  • El modificador concurrently mantiene la tabla accesible para lectura y escritura durante el proceso.

El sistema clásico de vacuum marca el espacio como reutilizable pero no reduce el tamaño físico del archivo en disco. Vacuum full liberaba espacio pero bloqueaba completamente la tabla, limitación que supera la nueva integración nativa.

Optimización y características adicionales

  • El módulo pg plan advice fija planes de ejecución para prevenir regresiones de rendimiento.
  • El comando copy incorpora soporte directo para exportar datos en formato JSON.

La versión 19 incluye mejoras adicionales como la desactivación por defecto de JIT debido a estimaciones de costos poco confiables y la limpieza paralela de índices en vacuum para reducir tiempos de mantenimiento.

커뮤니티 글

모든 글 보기