15 points par GN⁺ 2025-05-22 | 4 commentaires | Partager sur WhatsApp
  • 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.

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() et uuid_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 de gen_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

 
jaylee 2025-05-23

J'utilise plutôt Prisma + ULID. C'est bien plus court, et je préfère.

 
ssssut 2025-05-22

J’utilisais des fonctions comme uuid_generate_v7(), donc c’est une nouvelle qui fait plaisir.

 
stomx 2025-05-22

Oh !!

 
halfenif 2025-05-22

Oh... !