使用postgresql DB存储NULL值需要多少磁盘空间?

时间:2010-11-19 22:04:11

标签: sql postgresql types nullable

假设我的表上有一列定义了以下内容:

"MyColumn" smallint NULL

存储类似0,1或其他值的值应该需要2个字节(1)。但是如果我将“MyColumn”设置为NULL,需要多少空间?它需要0个字节吗?

是否有一些额外需要的字节用于管理目的或每个列/行都有这样的东西?

(1)http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html

3 个答案:

答案 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:)