Laramie má s bitmapou pravdu a odkazuje na správné místo v příručce. Přesto je to téměř, ale ne zcela správné:
Takže pro každý daný řádek s jednou nebo více hodnotami null by velikost přidaná k němu odpovídala velikosti bitmapy (N bitů pro tabulku s N-sloupci, zaokrouhleno nahoru).
Je třeba vzít v úvahu zarovnání dat. HeapTupleHeader
(na řádek) je dlouhý 23 bajtů, skutečná data sloupce vždy začínají násobkem MAXALIGN
(obvykle 8 bajtů). Zůstane tak jeden bajt výplně, který může nulová bitmapa využít. Ve skutečnosti je NULL úložiště pro tabulky do 8 sloupců zcela zdarma .
Poté další MAXALIGN
(obvykle 8) bajtů je alokováno pro další MAXALIGN * 8
(obvykle 64) sloupců. atd. Vždy pro celkový počet uživatelských sloupců (vše nebo nic ). Ale pouze pokud je v řádku alespoň jedna skutečná hodnota NULL.
Provedl jsem rozsáhlé testy, abych to všechno ověřil. Další podrobnosti:
- Nepoužívá v PostgreSQL stále v záhlaví bitmapu NULL?