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

camsedfj  于 5个月前  发布在  PostgreSQL
关注(0)|答案(3)|浏览(68)

让我们假设我有一个列在我的表定义如下:

"MyColumn" smallint NULL

字符串
存储像0、1或其他值应该需要2个字节(1)。但是如果我将“MyColumn”设置为NULL,需要多少空间?它需要0个字节吗?
是否有一些额外的字节需要管理的目的或这样的事情为每列/行?
(1)http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html

gr8qqesn

gr8qqesn1#

Laramie关于位图是正确的,他链接到手册中的正确位置。然而,这几乎是,但不完全正确:
因此,对于具有一个或多个空值的任何给定行,添加到它的大小将是位图的大小(N列表的N位,四舍五入)。
必须考虑数据对齐。HeapTupleHeader(每行)占用23个字节,实际列数据总是从MAXALIGN的倍数开始(通常为8个字节)。这就留下了一个字节的填充,可以由空位图使用。实际上空存储对于最多8列的表是绝对免费的
之后,另一个MAXALIGN(通常为8)字节被分配给下一个MAXALIGN * 8(通常为64)列。等等。总是为用户列的总数(* 全部或无 *)。但只有当行中至少有一个实际空值时。
我进行了大量的测试来验证这一切。更多细节:

  • 在PostgreSQL中不使用NULL是否仍然在头中使用NULL位图?
2w3rbyxf

2w3rbyxf2#

不存储空值列。行的开头有一个位图,每列有一位用于指示哪些列为空值或非空值。如果行中所有列都为非空值,则可以省略位图。因此,对于具有一个或多个空值的任何给定行,添加到该行的大小将是位图的大小(对于N列表,为N位,四舍五入)。
从这里的文档更深入的讨论

ntjbwcob

ntjbwcob3#

它应该需要1个字节(0x00),但是它是表的结构,构成了大部分的空间,添加这一个值可能会改变一些东西(如添加一行),这需要更多的空间比它的数据总和。

**编辑:**拉勒米似乎比我更了解null:)

相关问题