2015-08-24 6 views
7

Ich speichere UUID v4 Werte in einer PostgreSQL v9.4 Tabelle, unter der Spalte "id".Leistungsunterschied zwischen UUID, CHAR und VARCHAR in PostgreSql-Tabelle?

Wenn ich die Tabelle erstellen, gibt es einen Unterschied in der folgenden Schreib- oder Lese-Leistung, ob ich die Spalte "ID" als VARCHAR(36), CHAR(36) oder UUID Datentyp definieren?

Danke!

+0

Soweit mir bekannt ist, verwendet der UUID-Typ 16 Bytes und speichert im Grunde die UUID als was es ist: eine 128-Bit-Ganzzahl. Ein 'char (36)' oder 'varchar (36)' würde 36 Bytes verwenden. Ich kann jedoch nicht mehr finden, wo das dokumentiert ist. Darüber hinaus müssen Sie wissen, welche Auswirkungen PostgreSQL auf das Tabellen/Index-Clustering hat, wenn Ihre UUID Ihr Schlüssel ist und Sie die CLUSTER-Option verwenden möchten. –

+0

http://simononsoftware.com/how-to-store-uuids-in-postgresql/ –

Antwort

14

Verwenden Sie uuid. PostgreSQL hat den nativen Typ aus einem bestimmten Grund.

Es speichert die UUID intern als 128-Bit-Binärfeld. Ihre anderen vorgeschlagenen Optionen speichern sie als hexadezimal, was im Vergleich sehr ineffizient ist.

Nicht nur das, sondern:

  • uuid macht eine einfache byteweise Art für die Bestellung. text, char und varchar berücksichtigen Sie Kollationen und Gebietsschemata, was für eine UUID unsinnig ist.

  • Es gibt nur eine kanonische Darstellung eines uuid. Das gleiche gilt nicht für Text usw.; Sie müssen gegen kleingeschrieben hex, Vorhandensein oder Fehlen von {...-...} s usw.

Es gibt einfach keine Frage obere betrachten. Verwenden Sie uuid.

Der einzige andere Typ, der einen Sinn ergibt, ist bytea, die zumindest verwendet werden kann, um die 16 Bytes der UUID direkt zu speichern. Dies würde ich tun, wenn ich Systeme verwenden würde, die mit Datentypen außerhalb des Basissatzes nicht umgehen können, wie ein wirklich dummer ORM irgendeiner Art.

2

UUID wäre am schnellsten, weil seine 128 Bits -> 16 Bytes und Vergleiche numerisch erfolgen.

Char (36) und varchar (36) scheint identisch zu sein und langsam: http://www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/.

Der Server sollte EOF überprüfen, um festzustellen, ob der Wert für jedes Zeichen gelesen wurde oder nicht.

Auch Textvergleich ist langsamer als numerischer Vergleich. Und da UUID aus 16 Bytes besteht, ist der Vergleich von UUID viel schneller als der Vergleich von zwei Texten mit 36 ​​Zeichen.

Verwenden Sie native UUID für die Leistung.

+0

Ihre Erklärung ist falsch.Es gibt hier keinen signifikanten Leistungsunterschied zwischen 'char' und' varchar', zumindest so wie von PostgreSQL gespeichert. Beide werden intern als 'VARLENA' gespeichert. Außerdem ist eine UUID 16 Bytes (128 Bits); Ich weiß nicht, wo Sie "5 hexadezimale Werte" bekommen. –

+0

Nun, ich sagte auch, dass es 128 Bits und 16 Bytes ist. Und 5 hexadezimale Werte kommt aus der Definition, lesen Sie bitte: http://StackOverflow.com/Questions/32188497/Mysql-Custom-Alphabetical-Column-Order –

+0

Über Char und Varchar ist das gleiche, yyes, du hast Recht: http : //www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/ –

0

Die Indexgröße ist vielleicht der bemerkenswerteste Unterschied: fast 86% mehr für VARCHAR.

Aus Performance-Sicht bemerkte ich keine signifikanten Unterschiede in PostgreSQL 9.5.