Was ist der effizienteste UUID-Spaltentyp?

15

Zum Speichern einer 128-Bit-UUID gibt es mehrere Speicheroptionen:

  1. eine Byte [16] -Spalte
  2. Zwei Spalten mit einer Länge von 64 Bit
  3. eine CHAR (36) -Spalte - 32 Hexadezimalziffern + 4 Striche.
  4. eine datenbankspezifische UUID-Spalte, falls dies von db unterstützt wird

Aus Sicht der Indizierung, welche davon sind die effizientesten? Wenn die Datenbank keinen dedizierten UUID-Typ unterstützt, welcher von 1, 2, 3 ist der beste Kandidat?

Vlad Mihalcea
quelle
1
Dies ist ein bisschen zu "es kommt darauf an" - viele Implementierungsspezifikationen.
Craig Ringer
2
Ich würde niemals 3 wählen: Speichern Sie niemals etwas in 36 Bytes, wenn dies in 16 möglich ist. Ich verwende es raw(16)in Oracle und uuidin PostgreSQL.
Colin 't Hart
1
je einfacher desto besser.
Akuzminsky
uuid>> bytea>> textmit CHECKEinschränkung> varchar(36)>> char(36). Siehe: dba.stackexchange.com/a/89433/3684 und dba.stackexchange.com/a/115316/3684 .
Erwin Brandstetter

Antworten:

15

Ein dedizierter uuid Typ ist die beste Wahl für PostgreSQL. Schwer zu sagen bei anderen DBs - es ist nicht unmöglich, dass jemand einen uuidTyp implementiert , der weniger effizient gespeichert ist als ein einfacher Bytetyp .

Wieder in PostgreSQL, bytea wäre dies eine sinnvolle Möglichkeit, UUIDs zu speichern, wenn Sie nicht den uuidTyp hätten. Bei anderen DBs hängt es davon ab, wie sie Binärdaten speichern.

Wenn möglich, würde ich die Verwendung von Hex-mit-Bindestrichen nachdrücklich vermeiden. Es ist weitaus weniger effizient zu vergleichen, zu sortieren und zu speichern.

Also wirklich "nicht (2) oder (3)". Je. Verwenden Sie (4) wo unterstützt, (1) sonst.

Craig Ringer
quelle
Zu beachten ist, dass der PostgreSQL-UUID-Typ in Arrays nicht nativ unterstützt wird oder wurde dies behoben? postgresql.org/message-id/…
Christophe Roussy
@ChristopheRoussy Das ist aus dem Jahr 2013. Es war ein kleines Versehen. SELECT ARRAY['ef1e0638-072e-4caa-88b3-97bfa5b2e8c3']::uuid[]
Craig Ringer
3

In der Präferenzreihenfolge: 4,1,2,3 Verwenden Sie keine UUIDs als Clustering-Schlüssel, wenn Sie SQL Server verwenden, da dieser nicht nur fehlerhaft fragmentiert wird, sondern der Clustering-Schlüssel in allen nicht geclusterten Indizes verwendet wird und Sie diese Bytes hinzufügen würden jede Indexzeile. Die Fragmentierung kann mithilfe von NEWSEQUENTIALID verringert werden. In der Regel wird jedoch eine Bingint-Identität für den Clustering-Schlüssel einer GUID vorgezogen, um ein Aufblähen in anderen Indizes zu verhindern.

Der Unterschied zwischen der Auswahl von 1 und 2 hängt davon ab, wie effizient die Datenbank zwei Spalten mit Basistypen in einem festen Array mit einer Spalte verarbeitet. Es sollte einfach genug sein, mit Dummy-Daten zu testen. Sehen Sie sich die Geschwindigkeit Ihrer Abfragen sowie die Größe der Indizes und Daten an. Klein + schnell ist das Beste!

GilesDMiddleton
quelle
1

Man müsste annehmen, dass jeder nativ unterstützte Datentyp im Produkt besser optimiert ist als alles, was als Kunde dieses Produkts zusammengestellt werden könnte. Danach hat jeder die kleinste Bytezahl, sodass Sie die maximale Anzahl von Zeilen pro Seite erhalten.

Michael Green
quelle
Stimmt, aber ist es nur die Bytegröße, die zählt? Hat der Typ keinen Einfluss auf den Indexierungsalgorithmus?
Vlad Mihalcea
@Vlad Ich benutze SQL Server. AFAIK Alle Datentypen werden beim Erstellen eines B-Baums (oder eines Hash-Index für 2104 im Speicher) gleich behandelt. Es gibt gute Gründe , dies so eng wie möglich zu halten.
Michael Green