You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何PostgreSQL在第8列后字段均为NOT NULL时仍创建额外NULL位图?

关于PostgreSQL中9列及以上表的8字节NULL位图问题

我完全明白你说的不是行头里用来标记前8列空值的1字节NULL位图,咱们专门聊一聊PostgreSQL里的另一种情况:当表的列数达到9列及以上,并且行中至少存在一个空值时,每行会额外新增的8字节NULL位图。

其实这个设计逻辑很清晰:

  • 行头里的1字节(8位)只能对应8列的空值状态,每一位代表一列是否为NULL;
  • 当列数超过8列后,PostgreSQL就需要更大的空间来存储所有列的空值标记,这时就会分配8字节(64位)的扩展NULL位图;
  • 注意哦,这个8字节的位图只有当行中存在至少一个空值时才会被启用,如果某一行所有列都不为空,这部分空间是不会被占用的,能帮你节省存储空间。

你提到已经通过创建测试表、填充数据,再用pgstattuple工具检查行大小来验证这个情况,这绝对是个非常直观且靠谱的测试方法。比如你可以做个小对比:

  1. 创建一个包含10列的表,插入一行所有列都非空的数据;
  2. 再插入一行有任意一列为空的数据;
  3. 用SELECT * FROM pgstattuple('你的表名');查看行的平均大小,就能明显看到后者比前者多了8字节的空间,这就是额外NULL位图带来的差异。

内容的提问来源于stack exchange,提问作者mnementh64

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:26:18