假设我的桌子上有一列定义了以下内容:
"MyColumn" smallint NULL
存储 0、1 或其他值等值应该需要 2 个字节 (1)。但是如果我将“MyColumn”设置为NULL,需要多少空间?需要0字节吗?
每列/行是否有一些额外需要的字节用于管理目的或此类内容?
(1) http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html
Laramie 关于位图的说法是正确的,他链接到手册中的正确位置。然而,这几乎是,但并不完全正确:
因此,对于任何具有一个或多个空值的给定行,都会添加其大小 将是位图的位图(N 列表的 N 位,向上舍入)。
必须考虑数据对齐。
HeapTupleHeader
(每行)长 23 个字节,实际列数据始终以 MAXALIGN
的倍数(通常为 8 个字节)开始。这样就留下了一个字节的填充可供空位图使用。实际上,对于最多 8 列的表,NULL 存储是完全免费的。
之后,又为接下来的 MAXALIGN
(通常为 64)列分配另外
MAXALIGN * 8
(通常为 8)个字节。等等。始终为用户列总数(全部或全部)。但前提是该行中至少有一个实际 NULL 值。 我进行了广泛的测试来验证所有这些。更多详情:
Laramie 似乎比我更了解 null :)