私はこの質問を見ました ビット対ブール列 。
Postgresについても同じことを自問しています。1桁の整数の列は、ブール値の列と同じディスク領域を占めていますか?大きなテーブル(約50列x約5,000万行)で、どれが最もパフォーマンスが良いですか?どうすればこれを見つけることができますか?
あなたはストレージサイズを見つけることができます
SELECT typname, typlen FROM pg_type WHERE typname IN ('bool', 'int4');
typname | typlen
---------+--------
bool | 1
int4 | 4
(2 rows)
ただし、alignmentを考慮する必要があります。
SELECT typname, typlen, typalign FROM pg_type WHERE typname IN ('bool', 'int4');
typname | typlen | typalign
---------+--------+----------
bool | 1 | c
int4 | 4 | i
(2 rows)
c
は「文字」(1バイト)、i
は「整数」です。
次のようなテーブルを定義すると、
CREATE TABLE a (
b boolean,
i integer
);
列間に未使用の「パディング」バイトが3つあるため、整数を4で割り切れるアドレスに格納できます。
したがって、boolean
は1バイトではなく4バイトのストレージを占有します。
逆に列を指定すると、各行のデータが占めるスペースは5バイトになります。
テーブル行自体(「タプル」)は生データだけで構成されているのではなく、各行に23バイトの「タプルヘッダー」があります( ドキュメント を参照)。実際のタプルデータがMAXALIGN
の倍数(通常は8)で整列されるように、ヘッダーの後にパディングがある場合があります。
したがって、使用するストレージをできるだけ少なくするようにテーブルを最適化する場合は、テーブルの列の順序を考慮する必要があります。