15 puntos por GN⁺ 2025-05-22 | 4 comentarios | Compartir por WhatsApp
  • PostgreSQL 18 añade soporte nativo para UUIDv7, ofreciendo identificadores únicos ordenables y amigables con los índices
  • UUIDv7 conserva la unicidad y seguridad en entornos distribuidos de los UUID tradicionales, mientras adopta una estructura basada en tiempo favorable para los índices btree
  • Resuelve dos de las desventajas de usar UUID hasta ahora: la imposibilidad de ordenarlos y la fragmentación de los índices, logrando orden cronológico y optimización de inserciones
  • En PostgreSQL 18 se pueden generar UUID con la función uuidv7(), y también se ofrecen extracción de timestamp y entrada de tiempo personalizada
  • Con esto, desaparecen los motivos para dudar de usar UUID como clave primaria, y pasa a ser una opción más adecuada para sistemas distribuidos y entornos multi-tenant

PostgreSQL 18

  • Ya salió la versión beta de PostgreSQL 18, y las pruebas siguen en marcha con miras al lanzamiento oficial en septiembre
  • Funciones principales:
    • Async I/O: entrada/salida asíncrona basada en io_uring, con mejoras de velocidad de 2~3x en sequence scan y vacuum
    • Skip scan en índices btree multicolumna, optimización de consultas OR/IN
    • Conservación de estadísticas del planner entre upgrades
    • Función UUIDv7
    • Columnas generadas virtuales, inicio de sesión con OAuth, y agregado de información de I/O/CPU/WAL en EXPLAIN, entre otras

Ventajas de UUID

  • Posibilidad de generar IDs únicos en entornos distribuidos
  • Mayor seguridad gracias a identificadores públicos impredecibles
  • Posibilidad de generar IDs directamente desde el cliente, minimizando la comunicación con el servidor

Desventajas de los UUID tradicionales

  • No se pueden ordenar
  • Baja localidad en los índices, lo que degrada el rendimiento de inserción
  • Tamaño de 128 bits, que implica overhead

La solución de UUIDv7

  • Nueva versión de UUID introducida conforme a RFC 9562 (publicada en mayo de 2024)
  • Usa en los primeros 48 bits un timestamp basado en Unix Epoch, y en el resto una combinación de valores aleatorios + contador
  • Permite ordenación cronológica y mejora la eficiencia de inserción en índices
  • UUIDv6 queda para compatibilidad hacia atrás, y UUIDv8 para usos experimentales o extensiones de vendors
  • UUIDv7 es el único estándar nuevo con relevancia práctica real

Uso de UUIDv7 en PostgreSQL 18

  • La función uuidv7() genera UUID basados en la hora actual
  • uuidv7(INTERVAL) permite aplicar el offset de tiempo deseado
  • Las funciones uuid_extract_version() y uuid_extract_timestamp() permiten extraer la versión del UUID y su hora de creación
  • Ejemplo:
    CREATE TABLE test (  
        id uuid DEFAULT uuidv7() PRIMARY KEY,  
        name text  
    );  
    
    INSERT INTO test (name) VALUES ('foo');  
    INSERT INTO test (name) VALUES ('bar');  
    INSERT INTO test (id, name) VALUES (uuidv7(INTERVAL '-1 hour'), 'oldest');  
    
    SELECT uuid_extract_timestamp(id), name FROM test ORDER BY id;  
    
  • uuidv4() se añade como alias de gen_random_uuid()

Conclusión y recomendación

  • UUIDv7 es una buena opción para quienes sufrían problemas de rendimiento con UUID tradicionales
  • Mantiene las ventajas de UUID sin sacrificar ordenación ni rendimiento de índices
  • Ya se puede probar desde ahora en la beta de PostgreSQL 18
  • Es una opción adecuada para generación de IDs en sistemas distribuidos, apps multi-tenant y entornos serverless
    > “UUIDv7 es una incorporación discreta pero poderosa, que hace reconsiderar el uso de UUID como clave primaria en Postgres”

4 comentarios

 
jaylee 2025-05-23

Yo estoy usando Prisma + ULID en su lugar. Es mucho más corto y me gusta más.

 
ssssut 2025-05-22

Estaba usando algo como una función uuid_generate_v7(), así que es una noticia que da gusto ver.

 
stomx 2025-05-22

¡Oh!

 
halfenif 2025-05-22

Oh...!