假设我的表中有一列定义如下:
"MyColumn" smallint NULL
存储 0、1 或其他值应该需要 2 个字节 (1)。但是,如果我将“MyColumn”设置为 NULL,需要多少空间呢?它需要 0 字节吗?
是否有一些额外需要的字节用于管理目的或每列/行的此类内容?
(1) http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html
最佳答案
Laramie关于位图和链接到手册中正确位置的信息是正确的。然而,这几乎是正确的,但并不完全正确:
So for any given row with one or more nulls, the size added to it would be that of the bitmap(N bits for an N-column table, rounded up).
必须考虑数据对齐。 HeapTupleHeader
(每行)长 23 个字节,实际列数据始终以 MAXALIGN
的倍数(通常为 8 个字节)开始。这留下了空位图可以使用的一个字节的填充。实际上,对于最多 8 列的表,NULL 存储是完全免费的。
之后,为接下来的 MAXALIGN * 8
(通常为 64)列分配另一个 MAXALIGN
(通常为 8)字节。等等。始终用于用户列的总数(全有或全无)。但前提是该行中至少有一个实际的 NULL 值。
我进行了大量测试来验证所有这些。更多详情:
关于sql - 使用 postgresql 数据库存储 NULL 值需要多少磁盘空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4229805/