5

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

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

4

1 回答 1

1

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

于 2011-02-07T15:16:43.603 回答