PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

È possibile memorizzare un numero di 1 byte in Postgres?

Dato che l'overhead per qualsiasi riga in PostgreSQL è 23 byte (HeapTupleHeaderData), se ti interessa davvero tanto spazio per piccole quantità, probabilmente hai scelto il modo sbagliato per archiviare i tuoi dati.

Indipendentemente da ciò, poiché tutti i tipi più complicati hanno il proprio sovraccarico (bytea aggiunge quattro byte di sovraccarico, ad esempio, stringhe di bit da 5 a 8), l'unico modo per ottenere ciò che stai cercando è usare un bigint (8 byte), spostando numericamente ogni valore e OR-ing insieme il risultato. Puoi farlo usando le operazioni sulle stringhe di bit per semplificare il codice, calcola come stringa di bit, quindi esegui il cast su bigint prima di archiviarlo o semplicemente moltiplicalo/aggiungi manualmente se desideri che la velocità sia migliore. Ad esempio, ecco come archiviare due byte insieme in una struttura a due byte e poi recuperarli di nuovo:

int2 = 256 * byte1 + byte2
byte1 = int2 / 256
byte2 = int2 % 256

Puoi estendere la stessa idea memorizzandone 7 in questo modo. Il sovraccarico di recupero sarà comunque terribile, ma in realtà avrai risparmiato spazio nel processo. Ma non molto relativo solo all'intestazione della riga.