W rzeczywistości jest to bardziej złożone.
Pusta mapa bitowa wymaga jednego bitu na kolumnę w wierszu, zaokrągloną w górę do pełnych bajtów. Jest tam tylko wtedy, gdy rzeczywisty wiersz zawiera co najmniej jedną wartość NULL i jest w tym przypadku w pełni przydzielony. NOT NULL
ograniczenia nie mają na to bezpośredniego wpływu. (Oczywiście, jeśli wszystkie pola w Twojej tabeli są NOT NULL
, bitmapa nigdy nie może być zerowa).
„Nagłówek krotki sterty” (na wiersz) ma długość 23 bajtów. Rzeczywiste dane zaczynają się od wielokrotności MAXALIGN
(Maksymalne wyrównanie danych ) po tym, co zwykle ma 8 bajtów w 64-bitowym systemie operacyjnym (4 bajty w 32-bitowym systemie operacyjnym). Uruchom następujące polecenie z katalogu binarnego PostgreSQL jako root, aby uzyskać ostateczną odpowiedź:
./pg_controldata /path/to/my/dbcluster
W typowej instalacji Postgres 12 opartej na Debianie wyglądałoby to tak:
sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
Tak czy inaczej, między nagłówkiem a wyrównanym początkiem danych znajduje się jeden wolny bajt, który może wykorzystać bitmapa zerowa. Jeśli Twoja tabela zawiera 8 lub mniej kolumn , pamięć NULL jest faktycznie całkowicie darmowa (jeśli chodzi o miejsce na dysku).
Następnie kolejny MAXALIGN
(zwykle 8 bajtów) jest przydzielanych dla zerowej mapy bitowej, aby pokryć inne (zwykle) 64 pola. Itd.
Dotyczy to co najmniej wersji 8.4 - 12 i najprawdopodobniej się nie zmieni.