Sotis Asked: 2019-08-27 01:06:29 +0800 CST2019-08-27 01:06:29 +0800 CST 2019-08-27 01:06:29 +0800 CST Postgres 中整数列与布尔列的磁盘使用情况 772 我看到了这个问题Bit vs. Boolean columns。 对于 Postgres,我问自己同样的问题:单个数字整数列是否占用与布尔值相同的磁盘空间?在大表(约 50 列 x 约 5000 万行)中,哪一个表现最好?我怎样才能找到这个? database-design postgresql 1 个回答 Voted Best Answer Laurenz Albe 2019-08-27T01:33:44+08:002019-08-27T01:33:44+08:00 您可以使用 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)的倍数对齐。 因此,如果您想优化表以使用尽可能少的存储空间,则需要考虑表中列的顺序。
您可以使用
但是,您需要考虑对齐:
c
是“字符”(1 个字节),i
而是“整数”。如果你定义一个这样的表:
您将在列之间获得三个未使用的“填充”字节,以便整数可以存储在可被 4 整除的地址。
所以
boolean
会占用 4 个字节而不是 1 个字节的存储空间。如果您以相反的方式指定列,则每行中的数据占用的空间将仅为 5 个字节。
表行本身(“元组”)不仅包含原始数据,而且每行都有一个 23 字节的“元组标题”(请参阅文档)。标头后面可能有填充,以便实际元组数据以
MAXALIGN
(通常为 8)的倍数对齐。因此,如果您想优化表以使用尽可能少的存储空间,则需要考虑表中列的顺序。