Postgresql

Postgres 中整數列與布爾列的磁碟使用情況

  • August 27, 2019

我看到了這個問題Bit vs. Boolean columns

對於 Postgres,我問自己同樣的問題:單個數字整數列是否佔用與布爾值相同的磁碟空間?在大表(約 50 列 x 約 5000 萬行)中,哪一個表現最好?我怎樣才能找到這個?

您可以使用

SELECT typname, typlen FROM pg_type WHERE typname IN ('bool', 'int4');

typname | typlen 
---------+--------
bool    |      1
int4    |      4
(2 rows)

但是,您需要考慮對齊

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
);

您將在列之間獲得三個未使用的“填充”字節,以便整數可以儲存在可被 4 整除的地址。

所以boolean會佔用 4 個字節而不是 1 個字節的儲存空間。

如果您以相反的方式指定列,則每行中的數據佔用的空間將僅為 5 個字節。

表行本身(“元組”)不僅包含原始數據,而且每行都有一個 23 字節的“元組標題”(請參閱文件)。標頭後面可能有填充,以便實際元組數據以MAXALIGN(通常為 8)的倍數對齊。

因此,如果您想優化表以使用盡可能少的儲存空間,則需要考慮表中列的順序。

引用自:https://dba.stackexchange.com/questions/246243