将列定义为可为 null 的smallint 时,假设存储 0 或 1 等值需要 2 个字节。但是,问题来了:当列设置为 NULL 时,会占用多少空间?
在 PostgreSQL 中,NULL 值不需要任何专用的存储空间。相反,位图用于指示行中的哪些列包含 NULL 值。对于任何具有一个或多个空值的行,适当大小的位图(向上舍入到最近的字节)将添加到行的标题中。
数据对齐起着至关重要的作用在内存管理中的作用。在 PostgreSQL 中,HeapTupleHeader(行头)占用 23 个字节,列数据始终与 MAXALIGN 的倍数(通常为 8 个字节)对齐。因此,行标题中存在一个字节的填充,可供空位图使用。
由于上述数据对齐,表最多最多 8 列可以完全免费存储 NULL 值。超出此限制,将为接下来的 64 列分配额外的 MAXALIGN 字节,依此类推。但是,仅当行中存在实际空值时,才会占用此额外空间。
即使从表中删除列,它们仍会继续占用一点如果它们仍然列在 pg_attribute 系统目录中,则位于空位图中。因此,删除的列可能会增加空位图所需的空间,即使在 VACUUM FULL 操作之后,空位图也可能持续存在。
PostgreSQL 中的 NULL 值是使用位图机制有效存储的。但是,数据对齐和表中的列数可能会影响存储这些值所需的磁盘空间量。了解这些优化技术有助于优化数据库性能并最大限度地减少存储需求。
以上是PostgreSQL 中 NULL 值实际消耗多少磁盘空间?的详细内容。更多信息请关注PHP中文网其他相关文章!