Ve skutečnosti je to složitější.
Nulová bitmapa potřebuje jeden bit na sloupec v řádku, zaokrouhlený nahoru na celé bajty. Je zde pouze v případě, že skutečný řádek obsahuje alespoň jednu hodnotu NULL a je v takovém případě plně přidělen. NOT NULL
omezení to přímo neovlivňují. (Samozřejmě, pokud jsou všechna pole vaší tabulky NOT NULL
, nikdy nemůže existovat nulová bitmapa.)
"Hlava n-tice haldy" (na řádek) je dlouhá 23 bajtů. Skutečná data začínají na násobku MAXALIGN
(Maximální zarovnání dat ), což je obvykle 8 bajtů na 64bitovém OS (4 bajty na 32bitovém OS). Spusťte následující příkaz z vašeho binárního adresáře PostgreSQL jako root, abyste získali definitivní odpověď:
./pg_controldata /path/to/my/dbcluster
Na typické instalaci Postgres 12 založené na Debianu by to bylo:
sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
V obou případech je mezi záhlavím a zarovnaným začátkem dat jeden volný bajt, který může nulová bitmapa využít. Pokud má tabulka 8 nebo méně sloupců , úložiště NULL je efektivně zcela zdarma (pokud jde o místo na disku).
Poté další MAXALIGN
(obvykle 8 bajtů) je přiděleno pro nulovou bitmapu, aby pokrylo dalších (obvykle) 64 polí. atd.
Toto platí minimálně pro verze 8.4 – 12 a s největší pravděpodobností se nezmění.