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?