显然PostgreSQL在header of each database row中存储了一些值。
如果我不在表中使用空值-空位图还在吗?
NOT NULL定义列有什么区别吗?

最佳答案

其实比那更复杂。
空位图需要行中每列一位,四舍五入为整字节。只有当实际行至少包含一个空值并且在这种情况下完全分配时,它才存在。NOT NULL约束不会直接影响这一点。(当然,如果表中的所有字段都NOT NULL,则决不能有空位图。)
“堆元组头”(每行)的长度为23字节。实际数据从MAXALIGN的倍数开始,在64位操作系统上通常是8字节(在32位操作系统上是4字节)。从PostgreSQL二进制目录以根用户身份运行以下命令,以获得最终答案:

./pg_controldata /path/to/my/dbcluster

在Postgres9.3的典型Debian安装中,应该是:
sudo /usr/lib/postgresql/9.3/bin/pg_controldata /var/lib/postgresql/9.3/main

无论哪种方式,在数据的头和对齐的开始之间都有一个空闲字节,空位图可以利用这个字节。只要您的表有8列或更少,空存储实际上是绝对空闲的(就磁盘空间而言)。
之后,为空位图(加上填充)分配另一个MAXALIGN(通常是8字节)以覆盖另一个(通常是)64个字段。等。
这至少对8.4-9.6版本有效,而且很可能不会改变。

关于postgresql - 在PostgreSQL中不使用NULL仍在标题中使用NULL位图吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5008753/

10-16 00:49