2011-02-07 88 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指針。

相關問題