【问题标题】:How much disk-space is needed to store a NULL value using postgresql DB?使用 postgresql DB 存储 NULL 值需要多少磁盘空间?
【发布时间】:2011-05-12 21:40:13
【问题描述】:

假设我的桌子上有一个列定义如下:

"MyColumn" smallint NULL

存储 0、1 或其他值需要 2 个字节 (1)。但是如果我将“MyColumn”设置为 NULL,需要多少空间?它需要 0 个字节吗?

是否有一些额外需要的字节用于管理目的或每列/行的此类内容?

(1)http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html

【问题讨论】:

    标签: sql postgresql types nullable


    【解决方案1】:

    Laramie 关于位图是正确的,他链接到手册中的正确位置。然而,这几乎是正确的,但并不完全正确:

    因此,对于具有一个或多个空值的任何给定行,添加到它的大小 将是位图的位图(N 位为 N 列,四舍五入)。

    必须考虑数据对齐。 HeapTupleHeader(每行)为 23 个字节长,实际列数据总是以 MAXALIGN(通常为 8 个字节)的倍数开始。剩下一个字节的填充可以被空位图使用。实际上NULL 存储对于最多 8 列的表是完全免费的

    之后,为接下来的MAXALIGN * 8(通常为 64)列分配另一个MAXALIGN(通常为 8)字节。等等。总是针对用户列的总数(all or nothing)。但前提是该行中至少有一个实际的 NULL 值。

    我进行了广泛的测试来验证所有这些。更多详情:

    【讨论】:

    • 向大表添加没有默认值的列通常是一种快速操作。跨过 8 到 9 列(或 72 和 73 与 MAXALIGN = 8)之间的阈值时会变慢吗?
    • @PatrickBrinich-Langlois:是的,这是机制的可能结果。在这些情况下,物理表大小的增加也超出了人们的预期。由于涉及死元组等其他因素,因此效果不一定是线性的。如果现有的 NULL 位图(每行)有空间用于另一个 NULL 位,则表根本不会增长,这是常见的情况。
    【解决方案2】:

    不存储空列。该行的开头有一个位图,每列有一个位,指示哪些为空或非空。如果一行中的所有列都不为空,则可以省略位图。因此,对于具有一个或多个空值的任何给定行,添加到它的大小将是位图的大小(对于 N 列的 N 位,四舍五入)。

    来自文档here的更深入讨论

    【讨论】:

      【解决方案3】:

      它应该需要 1 个字节 (0x00) 但是它是构成大部分空间的表的结构,添加这个值可能会改变一些东西(比如添加一行),它需要比数据总和更多的空间它。

      编辑:Laramie 似乎比我更了解 null :)

      【讨论】:

        猜你喜欢
        • 2019-06-10
        • 1970-01-01
        • 2014-10-06
        • 2015-05-11
        • 2020-06-08
        • 1970-01-01
        • 2021-01-29
        • 2018-07-22
        • 2012-02-15
        相关资源
        最近更新 更多