- 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
Yo estoy usando Prisma + ULID en su lugar. Es mucho más corto y me gusta más.
Estaba usando algo como una función
uuid_generate_v7(), así que es una noticia que da gusto ver.¡Oh!
Oh...!