15 Punkte von GN⁺ 2025-05-22 | 4 Kommentare | Auf WhatsApp teilen
  • PostgreSQL 18 bietet native Unterstützung für UUIDv7 und liefert damit sortierbare, indexfreundliche eindeutige Kennungen
  • UUIDv7 bewahrt die Eindeutigkeit und Sicherheit in verteilten Umgebungen bestehender UUIDs und nutzt zugleich eine zeitbasierte Sortierstruktur, die für btree-Indizes vorteilhaft ist
  • Von den bisherigen Nachteilen klassischer UUIDs – keine Sortierbarkeit, unübersichtliche Indizes, Speichergröße – werden die ersten beiden behoben, wodurch zeitliche Sortierung und optimierte Inserts möglich werden
  • In PostgreSQL 18 lassen sich UUIDs mit der Funktion uuidv7() erzeugen; außerdem gibt es Funktionen zum Extrahieren von Zeitstempeln sowie zur Übergabe benutzerdefinierter Zeiten
  • Damit entfallen die bisherigen Gründe, UUIDs nur zögerlich als Primärschlüssel einzusetzen, sodass sie für verteilte Systeme und Multi-Tenant-Umgebungen eine passendere Wahl werden

PostgreSQL 18

  • Die Beta-Version von PostgreSQL 18 ist erschienen; Tests laufen mit Blick auf den offiziellen Release im September
  • Wichtige Funktionen:
    • Async I/O: Asynchrone Ein-/Ausgabe auf Basis von io_uring, mit 2~3-facher Beschleunigung bei Sequence Scans und Vacuum
    • Skip scan für mehrspaltige btree-Indizes, Optimierung von OR-/IN-Abfragen
    • Beibehaltung von Planner-Statistiken über Upgrades hinweg
    • UUIDv7-Funktion
    • Virtuelle generierte Spalten, OAuth-Login, zusätzliche I/O-/CPU-/WAL-Informationen in EXPLAIN usw.

Vorteile von UUIDs

  • Erzeugung eindeutiger IDs in verteilten Umgebungen möglich
  • Nicht vorhersagbare öffentliche Kennungen erhöhen die Sicherheit
  • Direkte ID-Erzeugung auf dem Client möglich, wodurch Serverkommunikation minimiert wird

Nachteile bisheriger UUIDs

  • Nicht sortierbar
  • Schlechtere Insert-Performance durch fehlende Index-Lokalität
  • Overhead durch die 128-Bit-Größe

Die Lösung mit UUIDv7

  • Neue UUID-Version, eingeführt gemäß RFC 9562 (veröffentlicht im Mai 2024)
  • Die ersten 48 Bit enthalten einen Unix-Epoch-basierten Zeitstempel, der Rest kombiniert Zufallswerte + Zähler
  • Chronologisch sortierbar und dadurch effizientere Index-Inserts
  • UUIDv6 dient der Abwärtskompatibilität, UUIDv8 für Experimente/Vendor-Erweiterungen
  • UUIDv7 ist der einzig praktisch relevante neue Standard

Verwendung von UUIDv7 in PostgreSQL 18

  • Mit der Funktion uuidv7() lassen sich UUIDs auf Basis der aktuellen Zeit erzeugen
  • Über uuidv7(INTERVAL) kann ein gewünschter Zeit-Offset berücksichtigt werden
  • Mit uuid_extract_version() und uuid_extract_timestamp() lassen sich UUID-Version und Erstellungszeit extrahieren
  • Beispiel:
    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() wurde als Alias für gen_random_uuid() hinzugefügt

Fazit und Empfehlungen

  • UUIDv7 ist gut geeignet für Nutzer, die bei bisherigen UUIDs unter Performance-Problemen litten
  • Sortierbarkeit und Index-Performance werden verbessert, ohne die Vorteile von UUIDs aufzugeben
  • Kann schon jetzt in der PostgreSQL-18-Beta getestet werden
  • Eine passende Wahl für die ID-Erzeugung in verteilten Systemen, Multi-Tenant-Apps und serverlosen Umgebungen

„UUIDv7 ist eine stille, aber leistungsstarke Erweiterung, die dazu anregt, UUIDs in Postgres wieder als Primärschlüssel in Betracht zu ziehen“

4 Kommentare

 
jaylee 2025-05-23

Ich verwende stattdessen Prisma + ULID. Das ist viel kürzer und besser.

 
ssssut 2025-05-22

Ich hatte bereits Funktionen wie uuid_generate_v7() erstellt und verwendet, daher sind das wirklich erfreuliche Neuigkeiten.

 
stomx 2025-05-22

Oh!!

 
halfenif 2025-05-22

Oh...!