2011-02-07 59 views
5

尽管很容易记录N​​ULL在行的postgresql元组头中仅占用1位,但NULL在可空列(不是元组,索引)的INDEX中占用多少空间?索引中的索引与元组中的索引相同,还是全列数据类型大小(EG:integer = 4字节)?NULL是否占用postgresql索引中的空间?

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

+0

那么,你可以自己部分地回答这个问题的一种方式 - 它们不能用(仅)与数据类型所需的相同数量的字节表示。在你的int示例中,4个字节的每个可能的组合代表一个有效的int值 - 所以不可能在这四个相同的字节中编码一个空值。 – 2011-02-07 09:25:54

回答

1

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

相关问题