假设我的表上有一列定义了以下内容:
"MyColumn" smallint NULL
存储类似0,1或其他值的值应该需要2个字节(1)。但是如果我将“MyColumn”设置为NULL,需要多少空间?它需要0个字节吗?
是否有一些额外需要的字节用于管理目的或每个列/行都有这样的东西?
(1)http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html
答案 0 :(得分:49)
Laramie关于位图是正确的,他链接到手册中的正确位置。然而,这几乎是,但不太正确:
因此,对于具有一个或多个空值的任何给定行,将添加大小 将是位图(N列表的N位,向上舍入)。
必须考虑数据对齐。 HeapTupleHeader
(每行)长度为23个字节,实际列数据始终以MAXALIGN
的倍数(通常为8个字节)开始。这留下了一个填充字节,可以由空位图使用。实际上对于最多8列的表格,NULL存储是完全免费的。
之后,为下一个MAXALIGN
(通常为64个)列分配另一个MAXALIGN * 8
(通常为8个)字节。等等。始终为用户列的总数(全部或全部)。但是,只有行中至少有一个实际的NULL值。
我进行了大量测试以验证所有这些。更多细节:
答案 1 :(得分:42)
不存储空列。该行在开始处有一个位图,每列有一位,表示哪些是空或非空。如果所有列在一行中都是非空的,则可以省略位图。因此,对于具有一个或多个空值的任何给定行,添加到其中的大小将是位图的大小(N列表的N位,向上舍入)。
来自文档here
的更深入讨论答案 2 :(得分:0)
它应该需要1个字节(0x00)但是它是构成大部分空间的表的结构,添加这个值可能会改变某些东西(比如添加一行),这需要更多的空间而不是数据的总和它
编辑: Laramie似乎比我更了解null:)