Obliczanie rozmiaru wiersza jest znacznie bardziej złożone.
Pamięć jest zwykle podzielona na 8 kB strony danych . Istnieje mały stały narzut na stronę, możliwe pozostałości nie są wystarczająco duże, aby zmieścić inną krotkę, a co ważniejsze, martwe wiersze lub procent początkowo zarezerwowany za pomocą FILLFACTOR
ustawienie.
I jest jeszcze więcej narzutu na rząd (krotka):identyfikator pozycji o długości 4 bajtów na początku strony, HeapTupleHeader
23 bajtów i dopełnienie wyrównania . Początek nagłówka krotki oraz początek danych krotki są wyrównane do wielokrotności MAXALIGN
, czyli 8 bajtów na typowej maszynie 64-bitowej. Niektóre typy danych wymagają wyrównania do następnej wielokrotności 2, 4 lub 8 bajtów.
Cytując instrukcję w tabeli systemowej pg_tpye
:
typalign
jest wyrównaniem wymaganym podczas przechowywania wartości tego typu. Dotyczy to przechowywania na dysku, a także większości reprezentacji wartości w PostgreSQL. Gdy wiele wartości jest przechowywanych kolejno, na przykład w reprezentacji pełnego wiersza na dysku, dopełnienie jest wstawiane przed daną tego typu, tak aby zaczynała się na określonej granicy. Odniesienie do wyrównania jest początkiem pierwszego punktu odniesienia w sekwencji.
Możliwe wartości to:
-
c
=char
wyrównanie, tj. nie jest potrzebne wyrównanie. -
s
=short
wyrównanie (2 bajty na większości maszyn). -
i
=int
wyrównanie (4 bajty na większości maszyn). -
d
=double
wyrównanie (8 bajtów na wielu komputerach, ale nie na wszystkich).
Przeczytaj o podstawach w instrukcji tutaj.
Twój przykład
Daje to 4 bajty dopełnienia po 3 integer
kolumny, ponieważ timestamp
kolumna wymaga double
wyrównanie i musi zaczynać się od następnej wielokrotności 8 bajtów.
Tak więc jeden rząd zajmuje:
23 -- heaptupleheader
+ 1 -- padding or NULL bitmap
+ 12 -- 3 * integer (no alignment padding here)
+ 4 -- padding after 3rd integer
+ 8 -- timestamp
+ 0 -- no padding since tuple ends at multiple of MAXALIGN
Plus identyfikator elementu na krotkę w nagłówku strony (jak wskazuje @A.H. w komentarzu):
+ 4 -- item identifier in page header
------
= 52 bytes
Dochodzimy więc do zaobserwowanych 52 bajtów .
Obliczenie pg_relation_size(tbl) / count(*)
to pesymistyczna ocena. pg_relation_size(tbl)
zawiera wzdęcia (martwe wiersze) i miejsce zarezerwowane przez fillfactor
, a także narzut na stronę danych i na tabelę. (I nawet nie wspomnieliśmy o kompresji dla długich varlena
dane w tabelach TOAST, ponieważ nie mają tu zastosowania.)
Możesz zainstalować dodatkowy moduł pgstattuple i wywołać SELECT * FROM pgstattuple('tbl_name');
aby uzyskać więcej informacji na temat rozmiaru tabeli i krotki.
Powiązane:
- Rozmiar tabeli z układem strony
- Obliczanie i oszczędzanie miejsca w PostgreSQL