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

问题描述 投票:0回答:3

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

"MyColumn" smallint NULL

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

每列/行是否有一些额外需要的字节用于管理目的或此类内容?

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

sql postgresql types nullable
3个回答
85
投票

Laramie 关于位图的说法是正确的,他链接到手册中的正确位置。然而,这几乎是,但并不完全正确:

因此,对于任何具有一个或多个空值的给定行,都会添加其大小 将是位图的位图(N 列表的 N 位,向上舍入)。

必须考虑数据对齐。

HeapTupleHeader
(每行)长 23 个字节,实际列数据始终以
MAXALIGN
的倍数(通常为 8 个字节)开始。这样就留下了一个字节的填充可供空位图使用。实际上,对于最多 8 列的表,NULL 存储是完全免费的。 之后,又为接下来的

MAXALIGN

(通常为 64)列分配另外

MAXALIGN * 8
(通常为 8)个字节。等等。始终为用户列总数(
全部或全部
)。但前提是该行中至少有一个实际 NULL 值。 我进行了广泛的测试来验证所有这些。更多详情:

    在 PostgreSQL 中不使用 NULL 仍然在标头中使用 NULL 位图吗?

75
投票

文档中更深入的讨论

这里


-1
投票

编辑:

Laramie 似乎比我更了解 null :)

© www.soinside.com 2019 - 2024. All rights reserved.