2010-11-19 19 views
25

powiedzmy mam kolumny na moim stole zdefiniowane następujące:Ile miejsca na dysku potrzeba do przechowywania wartości NULL przy użyciu postgresql DB?

"MyColumn" smallint NULL 

Przechowywanie wartości jak 0, 1 lub coś innego powinny potrzebować 2 bajty (1). Ale ile miejsca potrzeba, jeśli ustawię "MyColumn" na NULL? Czy będzie potrzebować 0 bajtów?

Czy są jakieś dodatkowe potrzebne bajty do celów administracyjnych lub takie rzeczy dla każdej kolumny/wiersza?

(1) http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html

Odpowiedz

31

Null kolumny nie są przechowywane. Wiersz ma bitmap na początku i jeden bit na kolumnę, który wskazuje, które z nich są zerowe lub nie-puste. Mapę bitową można pominąć, jeśli wszystkie kolumny mają wartość inną niż null. Tak więc dla dowolnego wiersza z jedną lub więcej wartościami zerowymi, rozmiar dodany do niego będzie równy rozmiarowi bitmapy (N bitów dla tabeli N-kolumnowej, zaokrąglone w górę).

bardziej dogłębne omówienie z docs here

0

Należy potrzeba 1 bajt (0x00), jednakże jest to struktura tabeli sprawia, że ​​większość przestrzeni, dodając tę ​​jedną wartość może coś zmienić (jak dodając wiersz), który potrzebuje więcej miejsca niż suma danych w nim zawartych.

Edit: Laramie zdaje się wiedzieć więcej o mnie niż zerowa :)

30

Laramie jest prawo o bitmapy, który łączy się we właściwym miejscu w instrukcji. Jednak, jest prawie, ale nie do końca poprawne:

Tak więc dla danego wiersza z jednym lub więcej null wielkość dodaje się do niej to, że na mapie bitowej (N bitów na stole N kolumnowej z zaokrągleniem w górę).

Należy uwzględnić wyrównanie danych. Wartość HeapTupleHeader (w jednym wierszu) wynosi 23 bajty, rzeczywiste dane kolumny zawsze zaczynają się od wielokrotności MAXALIGN (zwykle 8 bajtów). Pozostaje jeden bajt wypełnienia, który może być użyty przez zerową bitmapę. W efekcie NULL jest całkowicie bezpłatne dla tabel do 8 kolumn.

Po tym, kolejne MAXALIGN (zazwyczaj 8) bajty są przydzielane dla następnych MAXALIGN * 8 (zazwyczaj 64) kolumn. Etc. Zawsze dla całkowitej liczby kolumn użytkowników (wszystko albo nic). Ale tylko jeśli w wierszu znajduje się co najmniej jedna rzeczywista wartość NULL.

Przeprowadziłem szeroko zakrojone testy, aby zweryfikować to wszystko. Więcej szczegółów:

+2

Dodawanie kolumn bez wartości domyślnej dla dużych tabel jest zwykle szybkie działanie. Czy może być powolny, gdy przekroczysz próg między 8 a 9 kolumnami (lub 72 i 73 z "MAXALIGN = 8")? –

+1

@ PatrickBrinich-Langlois: Tak, to jest możliwa konsekwencja mechanizmu. Fizyczny rozmiar stołu również rośnie w większym stopniu niż można by oczekiwać w tych przypadkach. Efekt nie musi być liniowy, ponieważ zaangażowane są inne czynniki, takie jak martwe krotki. Tabela nie rośnie w ogóle, jeśli istniejące bitmapy NULL (w jednym wierszu) mają miejsce na kolejny bit NULL, co jest częstym przypadkiem. –