PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Ist es möglich, eine 1-Byte-Zahl in Postgres zu speichern?

Da der Overhead für jede Zeile in PostgreSQL 23 Bytes (HeapTupleHeaderData), wenn Sie so viel Wert auf wenig Speicherplatz legen, haben Sie wahrscheinlich den falschen Weg gewählt, um Ihre Daten zu speichern.

Unabhängig davon, da alle komplizierteren Typen ihren eigenen Overhead haben (Bytea fügt beispielsweise vier Bytes Overhead hinzu, Bitfolgen 5 bis 8), ist die einzige Möglichkeit, das zu erreichen, was Sie suchen, die Verwendung von Bigint (8 Bytes). numerisches Verschieben jedes Werts und OR-Verknüpfung des Ergebnisses. Sie können dies mit den Bitstringoperationen tun Um den Code einfacher zu machen - als Bit-String berechnen, dann vor dem Speichern in bigint umwandeln - oder einfach manuell multiplizieren/addieren, wenn Sie eine bessere Geschwindigkeit wünschen. So speichern Sie beispielsweise zwei Bytes zusammen in einer Zwei-Byte-Struktur und erhalten sie dann wieder zurück:

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

Sie können dieselbe Idee erweitern, indem Sie 7 davon auf diese Weise speichern. Der Abruf-Overhead wird immer noch schrecklich sein, aber Sie haben dabei tatsächlich etwas Platz gespart. Aber nicht sehr viel in Bezug auf den Zeilenkopf.