假设我的表上有一列定义了以下内容:
"MyColumn" smallint NULL
存储 0、1 或其他值等值应该需要 2 个字节 (1)。但是如果我将“MyColumn”设置为NULL,需要多少空间?需要0字节吗?
出于管理目的或每列/行是否有一些额外需要的字节?
(1) http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html
Laramie https://stackoverflow.com/a/4229863/939860关于位图的信息是正确的,并且链接到手册中正确的位置。然而,这几乎是正确的,但并不完全正确:
因此,对于具有一个或多个空值的任何给定行,添加到其中的大小
将是位图的位图(N 列表的 N 位,向上舍入)。
人们必须考虑数据对齐。这HeapTupleHeader
(每行)长度为 23 个字节,实际列数据始终以MAXALIGN
(通常为 8 字节)。这样就留下了一个字节的填充可供空位图使用。有效对于最多 8 列的表,NULL 存储是完全免费的.
之后,另一个MAXALIGN
(通常为 8)字节分配给下一个MAXALIGN * 8
(通常为 64)列。等等。始终为用户列总数(全有或全无)。但前提是该行中至少有一个实际 NULL 值。
我进行了广泛的测试来验证所有这些。更多细节:
- 在 PostgreSQL 中不使用 NULL 是否仍然在标头中使用 NULL 位图? https://stackoverflow.com/questions/5008753/does-not-using-null-in-postgresql-still-use-a-null-bitmask-in-the-header/7383198#7383198
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)