2011-02-07 18 views
5

NULL'ların satır için postgresql tuple üstbilgisinde yalnızca 1 bit aldıklarını belgelemekle birlikte, NULL'lerin NDE'ler null yapılabilen bir sütunun INDEX'inde ne kadar yer kaplar (tuple değil, dizin)? Dizin içinde, tuple ile aynı 1 bit mi, yoksa tam sütun veri tipi boyutu mu (EG: integer = 4 bayt)?NULLs, postgresql dizinlerinde yer kaplıyor mu?

Sorunun bağlamı, 3 referans sütununa (EG: foo_id, bar_id ve baz_id) sahip bir postgresql tablomuz ve herhangi bir satır için, bu sütunlardan yalnızca birinin bir değeri olacaktır (diğer 2 sütun NULL ol.) Ancak, endekslenecek 3 sütuna ihtiyacım var. Her sütunun bir tamsayı olduğunu varsayarak (postgresql'de 4 bayt), her satır 4 bayt (boş olmayan sütun için) artı 2 bit (2 boş sütun için) içermelidir. Ancak, 3 sütunun tamamı için dizinler ekleyeceksem, 3 endeks için depolama 12 bayt (dizin, boş bir değer için tam 4 bayt alırsa) veya aynı 4 bayt + 2 bit olur. Kendini tuple.

+0

Eh, bu kendinize kısmi olarak cevap verebilmenizin bir yolu - veri türü tarafından istenen sayıda baytla (sadece) temsil edilemezler. Int örneğinizde, her 4 baytlık kombinasyon geçerli bir int değerini temsil eder - bu nedenle, bir null'un aynı dört baytta kodlanmasının bir yolu yoktur. –

cevap

1

btree erişim yordamları, indeksden gerçek anahtarı almak için PageGetItem() öğesini kullanır. Bu yüzden btree dizin sayfalarının, düzenli yığın sayfaları (nullability maskesi dahil) ile aynı depolama düzenini kullandıklarına inanıyorum, sadece tüm btree işaretlerini tutmak için sayfanın "özel" bölgesinde ek gezinme bilgilerine sahipler.