gpt4 book ai didi

postgresql - 在 PostgreSQL 中不使用 NULL 是否仍然在 header 中使用 NULL 位图?

转载 作者:行者123 更新时间:2023-11-29 11:12:54 26 4
gpt4 key购买 nike

显然 PostgreSQL 在 header of each database row 中存储了几个值.

如果我不在该表中使用 NULL 值 - 空位图是否仍然存在?
使用 NOT NULL 定义列有什么不同吗?

最佳答案

实际上比这更复杂。

空位图需要行中每列一位,四舍五入到完整字节。只有当实际行包含至少一个 NULL 值并且在这种情况下被完全分配时,它才会存在。 NOT NULL 约束不会直接影响它。 (当然,如果您的表的所有字段都是 NOT NULL,则永远不会有空位图。)

“堆元组头”(每行)长 23 个字节。实际数据从 MAXALIGN(最大数据对齐)的倍数开始,在 64 位操作系统上通常为 8 个字节(在 32 位操作系统上为 4 个字节)。以 root 身份从 PostgreSQL 二进制目录运行以下命令以获得明确的答案:

./pg_controldata /path/to/my/dbcluster

在典型的基于 Debian 的 Postgres 12 安装上:

sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main

无论哪种方式,在 header 和数据的对齐开始之间都有一个空闲字节,空位图可以利用它。只要您的表有 8 列或更少,NULL 存储实际上完全免费(就磁盘空间而言)。

之后,为空位图分配另一个MAXALIGN(通常为 8 个字节)以覆盖另一个(通常)64 个字段。等等

这至少对版本 8.4 - 12 有效并且很可能不会改变。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com