在 PostgreSQL 中,允许 NULL 值的列的存储要求与强制值的列不同。考虑下面的表列定义:
"MyColumn" smallint NULL
存储整数(例如 0、1 或任何其他值)需要 2 个字节。但是,问题来了:当“MyColumn”设置为NULL时,会消耗多少磁盘空间?它占用 0 字节吗?
位图与 NULL 存储
与最初假设的 0 字节消耗相反,NULL 值不占用任何空间。相反,PostgreSQL 使用 位图 来跟踪表中每列的 NULL 状态。位图中的每一位代表特定行的 NULL/NOT NULL 状态。
但是,位图并未分配给每一行。相反,数据对齐是一个需要考虑的因素。 HeapTupleHeader包含每行的信息,占用23字节。数据以 MAXALIGN 的倍数(通常为 8 字节)开始对齐,为空位图留下一个字节的填充。
磁盘空间要求
由于这些因素,空存储对于最多 8 列的表来说实际上是免费的。但是,对于具有更多列的表,需要额外的磁盘空间,如下所示:
真实世界测试
广泛的测试已经证实了这些观察结果。有关更多详细信息,请参阅以下讨论:
以上是PostgreSQL 中的 NULL 值实际消耗多少磁盘空间?的详细内容。更多信息请关注PHP中文网其他相关文章!