Zum Speichern einer 128-Bit-UUID gibt es mehrere Speicheroptionen:
- eine Byte [16] -Spalte
- Zwei Spalten mit einer Länge von 64 Bit
- eine CHAR (36) -Spalte - 32 Hexadezimalziffern + 4 Striche.
- 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?
sql-server
mysql
oracle
postgresql
index
Vlad Mihalcea
quelle
quelle
raw(16)
in Oracle unduuid
in PostgreSQL.uuid
>>bytea
>>text
mitCHECK
Einschränkung>varchar(36)
>>char(36)
. Siehe: dba.stackexchange.com/a/89433/3684 und dba.stackexchange.com/a/115316/3684 .Antworten:
Ein dedizierter
uuid
Typ ist die beste Wahl für PostgreSQL. Schwer zu sagen bei anderen DBs - es ist nicht unmöglich, dass jemand einenuuid
Typ 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 denuuid
Typ 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.
quelle
SELECT ARRAY['ef1e0638-072e-4caa-88b3-97bfa5b2e8c3']::uuid[]
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!
quelle
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.
quelle