Wenn Sie Platz sparen möchten, können Sie den Datentyp "char"
Verwenden. Es speichert ein einzelnes Byte.
sie können integer
oder text
in "char"
umwandeln:
SELECT 'u'::"char", 'd'::"char", 'n'::"char";
char | char | char
------+------+------
u | d | n
(1 row)
Eine Aufzählung verwendet 4 Bytes, da sie intern als real
gespeichert ist.
Um Platz zu sparen, müssen Sie Ausrichtung berücksichtigen. Die Werte werden immer gemäß Typausrichtung ausgerichtet. Zum Beispiel muss ein bigint
immer an einer Adresse beginnen, die durch 8 teilbar ist.
Nun, wenn Ihre Tabelle definiert ist als
CREATE TABLE (
smallflag "char",
largenum bigint
);
zwischen den Spalten befinden sich 7 Auffüllbytes, wodurch alle Platzgewinne aus "char"
moot gerendert werden.
Platzieren Sie Ihre Tabellenspalten daher sorgfältig.
Ein bisschen hacken, aber wenn Sie die Spalte nullbar machen, können Sie trotzdem einen Bool mit einem Nullwert als drittem Wert verwenden.
Boolean verwendet jedoch immer noch 1 Byte in Postgres.
Es gibt eine tinyint-Erweiterung, die Ganzzahlen von -128 bis 127 in einem einzelnen Byte Speicherplatz speichern kann. Derzeit ist jedoch ein Umschreiben erforderlich, um mit Postgres Version 11 und höher kompatibel zu sein.
https://github.com/umitanuki/tinyint-postgresql
Warum dieser Datentyp in den wichtigsten Postgres-Typen immer noch nicht verfügbar ist, war mir immer ein Rätsel.