web-dev-qa-db-ja.com

Postgresの整数列とブール列のディスク使用量

私はこの質問を見ました ビット対ブール列

Postgresについても同じことを自問しています。1桁の整数の列は、ブール値の列と同じディスク領域を占めていますか?大きなテーブル(約50列x約5,000万行)で、どれが最もパフォーマンスが良いですか?どうすればこれを見つけることができますか?

6
Sotis

あなたはストレージサイズを見つけることができます

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)で整列されるように、ヘッダーの後にパディングがある場合があります。

したがって、使用するストレージをできるだけ少なくするようにテーブルを最適化する場合は、テーブルの列の順序を考慮する必要があります。

11
Laurenz Albe