Qual è il tipo di colonna UUID più efficiente


15

Per la memorizzazione di un UUID a 128 bit ci sono più opzioni di archiviazione:

  1. una colonna byte [16]
  2. due colonne bigint / long (64 bit)
  3. una colonna CHAR (36) - 32 cifre esadecimali + 4 trattini.
  4. una colonna specifica del database UUID, se db lo supporta

Dal punto di vista dell'indicizzazione, quali di questi sono i più efficienti? Se il db non supporta un tipo di uuid dedicato quale di 1, 2, 3 sono i migliori candidati?


1
Questo è un po 'troppo "dipende" - molte specifiche di implementazione.
Craig Ringer,

2
Non sceglierei mai 3: mai memorizzare qualcosa in 36 byte quando può essere fatto in 16. Uso raw(16)in Oracle e uuidin PostgreSQL.
Colin 't Hart,

1
più semplice è, meglio è.
Akuzminsky,

uuid>> bytea>> textcon CHECKvincolo> varchar(36)>> char(36). Vedi: dba.stackexchange.com/a/89433/3684 e dba.stackexchange.com/a/115316/3684 .
Erwin Brandstetter,

Risposte:


15

Un uuidtipo dedicato è la soluzione migliore per PostgreSQL. Difficile dirlo con altri DB: non è impossibile per qualcuno impiantare un uuidtipo memorizzato in modo meno efficiente di un semplice tipo di byte.

Ancora una volta in PostgreSQL, byteasarebbe un modo ragionevole per memorizzare gli UUID se non avessi il uuidtipo. Per altri DB dipende da come archiviano i dati binari.

Ove possibile, eviterei fortemente di usare i trattini esadecimali. È molto meno efficiente confrontare, ordinare e archiviare.

Quindi davvero "non (2) o (3)". Mai. Utilizzare (4) dove supportato, (1) in caso contrario.


Una cosa da notare è che il tipo UUID PostgreSQL non è supportato nativamente negli array o è stato corretto? postgresql.org/message-id/…
Christophe Roussy,

@ChristopheRoussy È del 2013. È stata una svista minore. SELECT ARRAY['ef1e0638-072e-4caa-88b3-97bfa5b2e8c3']::uuid[]
Craig Ringer,

3

Nell'ordine di preferenza: 4,1,2,3 Non utilizzare gli UUID come chiave di clustering se si utilizza SQL Server come, non solo si frammenterà male, la chiave di clustering viene utilizzata in tutti gli indici non cluster e si aggiungono quei byte a ogni riga dell'indice. La frammentazione può essere mitigata utilizzando NEWSEQUENTIALID ma di solito preferisce un'identità bingint per la chiave di cluster su un GUID per impedire il gonfiamento in altri indici.

La differenza tra la scelta di 1 su 2 dipenderà da quanto più efficiente il database gestisce due colonne di tipo base su un array fisso a colonna singola. Dovrebbe essere abbastanza facile testare con dati fittizi. Osserva la velocità delle tue query, nonché la dimensione di indici e dati. Piccolo + veloce è il migliore!


1

Si dovrebbe supporre che qualsiasi tipo di dati supportato in modo nativo sarebbe meglio ottimizzato nel prodotto rispetto a qualsiasi cosa possa essere messa insieme come cliente di quel prodotto. Successivamente, qualunque sia il numero di byte più piccolo in modo da ottenere il numero massimo di righe per pagina.


Vero, ma è importante solo la dimensione dei byte? Il tipo non influenza l'algoritmo di indicizzazione?
Vlad Mihalcea,

@Vlad Uso SQL Server. AFAIK tutti i tipi di dati vengono gestiti allo stesso modo quando si costruisce un albero B (o un indice hash per 2104 in memoria). Ci sono buoni motivi per mantenerlo il più stretto possibile.
Michael Green,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.