Laramie ma rację co do bitmapy i odwołuje się do odpowiedniego miejsca w instrukcji. Jednak jest to prawie, ale nie do końca poprawne:
Tak więc dla dowolnego wiersza z jedną lub większą liczbą wartości null, dodany do niego rozmiar będzie równy rozmiarowi mapy bitowej (N bitów dla tabeli N-kolumnowej, zaokrąglone w górę).
Trzeba wziąć pod uwagę wyrównanie danych. HeapTupleHeader (na wiersz) ma długość 23 bajtów, rzeczywiste dane w kolumnie zawsze zaczynają się od wielokrotności MAXALIGN (zwykle 8 bajtów). Pozostaje jeden bajt dopełnienia, który może być wykorzystany przez bitmapę zerową. W efekcie przechowywanie NULL jest całkowicie bezpłatne dla tabel do 8 kolumn .
Następnie kolejny MAXALIGN (zwykle 8) bajtów jest przydzielanych na następne MAXALIGN * 8 (zazwyczaj 64) kolumny. Itd. Zawsze dla łącznej liczby kolumn użytkowników (wszystko albo nic ). Ale tylko wtedy, gdy w wierszu jest co najmniej jedna rzeczywista wartość NULL.
Przeprowadziłem obszerne testy, aby to wszystko zweryfikować. Więcej szczegółów:
- Czy nie używasz NULL w PostgreSQL nadal używa bitmapy NULL w nagłówku?