Postgresql
Postgres 中整數列與布爾列的磁碟使用情況
我看到了這個問題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)的倍數對齊。因此,如果您想優化表以使用盡可能少的儲存空間,則需要考慮表中列的順序。