UUIDv7 wird in PostgreSQL 18 eingeführt
(thenile.dev)- 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.
- Async I/O: Asynchrone Ein-/Ausgabe auf Basis von
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()unduuid_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ürgen_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
Ich verwende stattdessen Prisma + ULID. Das ist viel kürzer und besser.
Ich hatte bereits Funktionen wie
uuid_generate_v7()erstellt und verwendet, daher sind das wirklich erfreuliche Neuigkeiten.Oh!!
Oh...!