UUIDv7 arrive dans PostgreSQL 18
(thenile.dev)- PostgreSQL 18 prend désormais en charge UUIDv7 nativement et propose des identifiants uniques triables et adaptés aux index
- UUIDv7 conserve l’unicité et la sécurité en environnement distribué des UUID existants, tout en adoptant une structure de tri basée sur le temps, favorable aux index btree
- Parmi les inconvénients des UUID classiques — impossibilité de trier, indexation chaotique, taille mémoire — les deux premiers sont résolus, ce qui permet un tri chronologique et des insertions optimisées
- Dans PostgreSQL 18, il est possible de générer des UUID avec la fonction
uuidv7(), avec en plus des fonctions d’extraction du timestamp et d’injection d’un temps personnalisé - Les raisons qui faisaient hésiter à utiliser des UUID comme clé primaire disparaissent désormais, ce qui en fait une option plus adaptée aux systèmes distribués et aux environnements multi-tenant
PostgreSQL 18
- La version bêta de PostgreSQL 18 est sortie, et les tests sont en cours en vue d’une sortie stable en septembre
- Fonctionnalités principales :
- Async I/O : entrées/sorties asynchrones basées sur
io_uring, avec des gains de vitesse de 2 à 3 fois sur les scans séquentiels et le vacuum - Skip scan sur les index btree multi-colonnes, optimisation des requêtes
OR/IN - Conservation des statistiques du planner entre les mises à niveau
- Fonction UUIDv7
- Colonnes générées virtuelles, connexion OAuth, ajout d’informations I/O/CPU/WAL dans EXPLAIN, etc.
- Async I/O : entrées/sorties asynchrones basées sur
Avantages des UUID
- Possibilité de générer des ID uniques dans un environnement distribué
- Identifiants publics imprévisibles qui renforcent la sécurité
- Génération directe des ID côté client, ce qui réduit les échanges avec le serveur
Inconvénients des UUID classiques
- Impossible à trier
- Faible localité des index, ce qui dégrade les performances d’insertion
- Taille de 128 bits, source de surcharge
La réponse apportée par UUIDv7
- Nouvelle version d’UUID introduite selon la RFC 9562 (publiée en mai 2024)
- Les 48 premiers bits contiennent un timestamp basé sur l’époque Unix, le reste combine valeurs aléatoires + compteur
- Tri chronologique possible et meilleure efficacité des insertions dans les index
- UUIDv6 sert à la compatibilité descendante, UUIDv8 aux expérimentations/extensions éditeur
- UUIDv7 est le seul nouveau standard réellement significatif en pratique
Utilisation de UUIDv7 dans PostgreSQL 18
- La fonction
uuidv7()génère un UUID basé sur l’heure actuelle uuidv7(INTERVAL)permet d’appliquer le décalage temporel souhaité- Les fonctions
uuid_extract_version()etuuid_extract_timestamp()permettent d’extraire la version de l’UUID et son heure de création - Exemple :
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()est ajouté comme alias degen_random_uuid()
Conclusion et recommandations
- UUIDv7 convient aux utilisateurs qui rencontraient des problèmes de performance avec les UUID classiques
- Il préserve les avantages des UUID tout en apportant triabilité et performances d’indexation
- Il peut être testé dès maintenant dans la bêta de PostgreSQL 18
- C’est une option adaptée à la génération d’ID dans les systèmes distribués, les applications multi-tenant et les environnements serverless
« UUIDv7 est une évolution discrète mais puissante, qui redonne envie d’utiliser des UUID comme clé primaire dans Postgres »
4 commentaires
J'utilise plutôt Prisma + ULID. C'est bien plus court, et je préfère.
J’utilisais des fonctions comme
uuid_generate_v7(), donc c’est une nouvelle qui fait plaisir.Oh !!
Oh... !