2015-04-26 15 views
8

Non sto tentando di riavviare l'UUID rispetto al dibattito sui numeri interi seriali. So che ci sono punti validi su entrambi i lati. Sto usando UUID come chiave primaria in molti dei miei tavoli.Prestazioni del tipo UUID PostgreSQL

  • Tipo di colonna: "uuidKey" text NOT NULL
  • Indice: CREATE UNIQUE INDEX grand_pkey ON grand USING btree ("uuidKey")
  • primaria vincolo di chiave: ADD CONSTRAINT grand_pkey PRIMARY KEY ("uuidKey");

Qui è la mia prima domanda; con PostgreSQL 9.4 c'è qualche vantaggio in termini di prestazioni nell'impostare il tipo di colonna in UUID?

La documentazione http://www.postgresql.org/docs/9.4/static/datatype-uuid.html descrive gli UUID, ma c'è qualche vantaggio oltre alla sicurezza del tipo per l'utilizzo di questo tipo al posto del tipo text? Nella documentazione sui tipi di carattere indica che char(n) non avrebbe alcun vantaggio su text in PostgreSQL.

Tip: Non v'è alcuna differenza di prestazioni tra questi tre tipi, a parte da aumentare lo spazio di memorizzazione quando si utilizza il tipo vuoto imbottito, ea alcuni cicli supplementare CPU per controllare la lunghezza quando la memorizzazione in un length- colonna vincolata. Mentre il carattere (n) ha i vantaggi dello in alcuni altri sistemi di database, non esiste un tale vantaggio in PostgreSQL; infatti il ​​carattere (n) è solitamente il più lento di tre a causa dei suoi costi di archiviazione aggiuntivi. Nella maggior parte dei casi, è necessario utilizzare il testo o caratteri diversi.

Non sono preoccupato per lo spazio su disco, mi chiedo solo se vale la pena confrontare i tipi di colonna UUID vs testo?

Seconda domanda, hash vs indici b-tree. Non ha senso ordinare le chiavi UUID, quindi b-tree avrebbe altri vantaggi rispetto all'indice hash?

+0

Se si sta creando un indice univoco oltre alla chiave primaria, non è necessario. Quando si imposta una chiave primaria, viene creato un indice univoco sulla chiave. –

+0

Forse l'ho mostrato nell'ordine sbagliato. L'indice è stato creato automaticamente dal vincolo principale della chiave. – adamek

+0

Sembra inoltre, secondo i documenti (al momento in cui questo commento 9.4 è l'ultima versione stabile), che l'uso degli indici hash sia scoraggiato: http://www.postgresql.org/docs/9.4/static/indexes -types.html –

risposta

14

A UUID è un valore di 16 byte. Lo stesso di text è un valore di 32 byte. Le dimensioni di archiviazione sono:

select 
    pg_column_size('a0eebc999c0b4ef8bb6d6bb9bd380a11'::text) as text_size, 
    pg_column_size('a0eebc999c0b4ef8bb6d6bb9bd380a11'::uuid) as uuid_size; 
text_size | uuid_size 
-----------+----------- 
     36 |  16 

Tabelle più piccole portano a operazioni più veloci.

Problemi correlati