PostgreSQL索引中的NULL值占用空间吗?

5
虽然已经有记录表明,NULL在postgresql元组头中仅占用1位,但是在可空列的INDEX中,NULL占用多少空间(不是元组,而是索引)?它是否与元组中的1位相同,还是等于完整的列数据类型大小(例如:integer = 4个字节)?
问题的背景是我有一个postgresql表格,其中有3个引用列(例如:foo_id、bar_id和baz_id),对于任何行,只有一个列会有值(另外2个列将为NULL)。然而,我需要对所有3个列建立索引。假设每个列都是整数(在postgresql中为4个字节),每一行应该占用4个字节(对于非空列)加上2个位(对于2个空列)。但是,如果我要为所有3个列添加索引,则这3个索引的存储空间将为12个字节(如果索引占用了空值的全部4个字节),或者与元组本身相同的4个字节+2个位。

有一种方法可以部分回答这个问题 - 它们不能被表示为与数据类型所需的字节数相同的字节数。在您的 int 示例中,4 个字节的每种可能组合都表示一个有效的 int 值 - 因此没有办法在这些相同的四个字节中编码空值。 - Damien_The_Unbeliever
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接