UUIDs in Firebird – Best Practices und Performance

Produkt- und Serviceankündigungen zu Firebird.

Moderator: martin.koeditz

Antworten
Benutzeravatar
martin.koeditz
Beiträge: 542
Registriert: Sa 31. Mär 2018, 14:35

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
Martin Köditz
SynDesk SW GmbH
Antworten