【问题标题】:Do NULLs take up space within postgresql indexes?NULL 是否占用 postgresql 索引中的空间?
【发布时间】:2011-02-07 09:08:48
【问题描述】:

虽然很容易证明 NULL 在该行的 postgresql 元组标题中仅占用 1 位,但 NULL 在可空列(不是元组,而是索引)的 INDEX 中占用了多少空间?是索引中的 1 位与元组中的相同,还是全列数据类型大小(EG:整数 = 4 字节)?

问题的上下文是我有一个 postgresql 表,它有 3 个引用列(例如:foo_id、bar_id 和 baz_id),对于任何行,只有其中一个列有值(其他 2 列是空值)。但是,我需要对所有 3 列进行索引。假设每列是一个整数(在 postgresql 中为 4 个字节),每行应占用 4 个字节(对于非空列)加上 2 位(对于 2 个空列)。但是,如果我要为所有 3 列添加索引,则 3 个索引的存储空间将是 12 个字节(如果索引占用了空值的全部 4 个字节)或与元组本身。

【问题讨论】:

  • 好吧,您可以自己部分回答这个问题的一种方式 - 它们不能用(仅)与数据类型所需的相同数量的字节数来表示。在您的 int 示例中,每个可能的 4 个字节组合都代表一个有效的 int 值 - 所以不可能在这四个字节中编码空值。

标签: postgresql null indexing storage space


【解决方案1】:

btree 访问例程使用 PageGetItem() 从索引中获取实际的键。所以我相信 btree 索引页面使用与常规堆页面相同的存储方案(包括可空性掩码),它们只是在页面的“特殊”区域中有额外的导航信息来保存所有 btree 指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2023-03-12
    • 2020-05-12
    • 2022-11-11
    • 2020-02-14
    • 2015-06-22
    相关资源
    最近更新 更多