Der aktuelle Firebird-Artikel Using UUID in Firebird beschäftigt sich mit dem effizienten Einsatz von UUIDs als Primärschlüssel in Firebird-Datenbanken. Dabei werden verschiedene Speicherformate und UUID-Versionen hinsichtlich Speicherbedarf und Performance verglichen.
Der Originalartikel ist hier zu finden:
https://www.firebirdsql.org/en/communit ... n-firebird
UUIDs speichern: BINARY(16) statt CHAR(36)
Die wichtigste Empfehlung lautet, UUIDs als `BINARY(16)` zu speichern.
Vorteile:
* Nur 16 Byte Speicherbedarf statt 36 Zeichen.
* Kleinere Indizes.
* Weniger Indexseiten.
* Schnellere Suchvorgänge.
In Tests mit einer Million Datensätzen benötigte ein Index auf Zeichenketten-UUIDs fast doppelt so viele Indexseiten wie ein Index auf binär gespeicherten UUIDs.
UUID Version 4 vs. UUID Version 7
UUID v4
Firebirds eingebaute Funktion `GEN_UUID()` erzeugt UUIDs der Version 4.
Eigenschaften:
* Vollständig zufällig.
* Sehr gute Verteilung.
* Führt jedoch zu starker Fragmentierung der B-Baum-Indizes.
Da neue Schlüssel an zufälligen Positionen eingefügt werden, entstehen häufige Seitensplits und schlechtere Clusterung.
UUID v7
UUID Version 7 basiert auf Zeitstempeln und ist weitgehend aufsteigend sortiert.
Vorteile:
* Weniger Indexfragmentierung.
* Schnellere Inserts.
* Schnellere Index-Scans.
* Bessere Cache-Ausnutzung.
Benchmark-Ergebnisse bei 1 Million Datensätzen:
| Test | UUID v4 | UUID v7 |
| ----------------------- | ------- | ------- |
| Insert | 12,0 s | 7,4 s |
| Vollständiger Indexscan | 1,19 s | 0,57 s |
UUID v7 erreicht damit nahezu die Performance eines numerischen `BIGINT`-Schlüssels.
Zusätzlicher Vorteil von UUID v7
Da UUID v7 einen Zeitstempel enthält, können Datensätze anhand ihrer UUID chronologisch sortiert werden.
Beispielsweise liefert ein absteigend sortierter Index auf einer UUID-v7-Spalte direkt die zuletzt eingefügten Datensätze. Dies ist mit UUID v4 nicht möglich.
Unterstützung in Firebird
* Firebird 5 bietet weiterhin `GEN_UUID()` für UUID v4.
* Firebird 6 unterstützt zusätzlich UUID v7 direkt über `GEN_UUID(7)`.
* Unter Firebird 5 kann UUID v7 bereits auf Anwendungsebene oder über UDRs erzeugt werden.
Fazit
Wer UUIDs in Firebird einsetzen möchte, sollte:
1. UUIDs als `BINARY(16)` speichern.
2. Für neue Anwendungen möglichst UUID v7 verwenden.
3. UUID v4 nur dann einsetzen, wenn vollständige Zufälligkeit wichtiger ist als Index-Performance.
UUID v7 kombiniert die Vorteile global eindeutiger Schlüssel mit einer deutlich besseren Performance bei Indizes und großen Datenmengen.
Ausführliche Artikel als PDF oder HTML:
Englisch: PDF or HTML
Portugiesisch: PDF or HTML
Russisch: PDF or HTML
UUIDs in Firebird – Best Practices und Performance
Moderator: martin.koeditz
- martin.koeditz
- Beiträge: 542
- Registriert: Sa 31. Mär 2018, 14:35
Martin Köditz
SynDesk SW GmbH
SynDesk SW GmbH