sql - 使用 postgresql 数据库存储 NULL 值需要多少磁盘空间?

标签 sql postgresql types nullable

假设我的表中有一列定义如下:

"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/

相关文章:

sql - 计算产品库存的加权平均成本

sql - 选择计数(*)或零

sql - 简化覆盖重复行的 UNION 查询

postgresql - SSL 错误 : point is not on curve with psycopg2 on Heroku

python - Python 函数中的类型错误

java - Java中任意两种基本类型之间的转换

sql - 如何为查询返回的每一行执行一次存储过程?

sql - Oracle 错误代码 ORA-00913 - IN CLAUSE 限制超过 65000 个值(每 1k 值使用 OR 条件)

sql - Postgres : Could not identify an ordering operator for type unknown

swift - 如何测试一个值是否是Int类型