스크립트
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.