2015-08-24 6 views
7

Sto memorizzando i valori UUID v4 in una tabella v4.4 PostgreSQL, nella colonna "id".Differenza di prestazione tra UUID, CHAR e VARCHAR nella tabella PostgreSql?

Quando creo la tabella, c'è qualche differenza nel seguire le prestazioni di scrittura o lettura se definisco la colonna "id" come VARCHAR(36), CHAR(36) o il tipo di dati UUID?

Grazie!

+0

Per quanto ne so, il tipo UUID utilizza 16 byte, praticamente memorizzando l'UUID così com'è: un numero intero a 128 bit. Un 'char (36)' o 'varchar (36)' userebbe 36 byte. Non riesco a trovare dove è documentato più, comunque. Oltre a ciò, è necessario essere consapevoli delle implicazioni di come PostgreSQL esegue il clustering di tabelle/indici se l'UUID sarà la vostra chiave e si prevede di utilizzare l'opzione CLUSTER. –

+0

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

risposta

14

Utilizzare uuid. PostgreSQL ha il tipo nativo per un motivo.

Memorizza internamente l'uu come campo binario a 128 bit. Le altre opzioni proposte la memorizzano come esadecimale, il che è molto inefficiente in confronto.

Non solo, ma:

  • uuid fa un semplice sorta byte per byte per l'ordinazione. text, char e varchar considerano le regole di confronto e le impostazioni locali, il che è privo di senso per un uuid.

  • Esiste solo una rappresentazione canonica di un uuid. Lo stesso non è vero per il testo ecc; bisogna considerare superiore vs minuscolo esadecimale, presenza o assenza di {...-...} s ecc

Non c'è proprio nessun problema. Utilizzare uuid.

L'unico altro tipo che ha senso è bytea, che almeno può essere utilizzato per memorizzare direttamente i 16 byte dell'uuid. Questo è quello che farei se usassi sistemi che non sono in grado di gestire tipi di dati esterni al set di base, come un ORM veramente stupido di qualche tipo.

2

UUID sarebbe il più veloce perché i suoi 128 bit -> 16 byte e confronti sono fatti numericamente.

Char (36) e varchar (36) sembrano uguali e lenti: http://www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/.

Il server deve controllare EOF per determinare il lavoro di lettura del valore completato o meno per ciascun carattere.

Anche il confronto del testo è più lento del confronto numerico. E poiché UUID è composto da 16 byte, confrontare UUID è molto più veloce rispetto al confronto di due testi di 36 caratteri.

Utilizzare UUID nativo per le prestazioni.

+0

La tua spiegazione non è corretta.Non vi è alcuna significativa differenza di prestazioni tra 'char' e' varchar' qui, almeno come memorizzati da PostgreSQL. Entrambi sono memorizzati internamente come "VARLENA". Inoltre, un UUID è di 16 byte (128 bit); Non so dove ottieni "5 valori esadecimali". –

+0

Bene, ho anche detto che sono 128 bit e 16 byte. E 5 valori esadecimali derivano dalla definizione, leggere per favore: http://stackoverflow.com/questions/32188497/mysql-custom-alphabetical-column-order –

+0

A proposito di char e varchar sono gli stessi, sì, hai ragione: http : //www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/ –

0

La dimensione dell'indice è forse la differenza più evidente: quasi l'86% in più per VARCHAR.

Dal punto di vista delle prestazioni, non ho notato differenze significative in PostgreSQL 9.5.