Výpočet velikosti řádku je mnohem složitější.
Úložiště je obvykle rozděleno na datové stránky o velikosti 8 kB . Existuje malá pevná režie na stránku, možné zbytky nejsou dostatečně velké, aby se vešly další n-tice, a co je důležitější, mrtvé řádky nebo procento původně rezervované pomocí FILLFACTOR
nastavení.
A ještě více režie na řádek (n-tice):identifikátor položky o velikosti 4 bajtů na začátku stránky, HeapTupleHeader
23 bajtů a vyplnění zarovnání . Začátek hlavičky n-tice i začátek dat n-tice jsou zarovnány na násobek MAXALIGN
, což je 8 bajtů na typickém 64bitovém počítači. Některé datové typy vyžadují zarovnání na další násobek 2, 4 nebo 8 bajtů.
Citace manuálu v systémové tabulce pg_tpye
:
typalign
je zarovnání požadované při ukládání hodnoty tohoto typu. Vztahuje se na úložiště na disku i na většinu reprezentací hodnoty v PostgreSQL. Když je za sebou uloženo více hodnot, jako například v reprezentaci celého řádku na disku, je před základ tohoto typu vložen výplň, takže začíná na zadané hranici. Referenční zarovnání je začátek prvního data v sekvenci.Možné hodnoty jsou:
c
=char
zarovnání, tj. není potřeba žádné zarovnání.
s
=short
zarovnání (2 bajty na většině počítačů).
i
=int
zarovnání (4 bajty na většině počítačů).
d
=double
zarovnání (8 bajtů na mnoha počítačích, ale v žádném případě ne na všech).
Přečtěte si základní informace v příručce zde.
Váš příklad
Výsledkem jsou 4 bajty výplně za vašimi 3 integer
sloupců, protože timestamp
sloupec vyžaduje double
zarovnání a musí začínat na dalším násobku 8 bajtů.
Takže jeden řádek zabírá:
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 identifikátor položky na n-tici v záhlaví stránky (jak poukázal @A.H. v komentáři):
+ 4 -- item identifier in page header
------
= 52 bytes
Dostáváme se tedy k pozorovaným 52 bajtů .
Výpočet pg_relation_size(tbl) / count(*)
je pesimistický odhad. pg_relation_size(tbl)
zahrnuje bloat (mrtvé řádky) a prostor vyhrazený fillfactor
a také režii na datovou stránku a tabulku. (A to jsme ani nezmínili kompresi pro dlouhé varlena
data v tabulkách TOAST, protože zde neplatí.)
Můžete nainstalovat doplňkový modul pgstattuple a zavolat SELECT * FROM pgstattuple('tbl_name');
pro více informací o velikosti stolu a n-tice.
Související:
- Velikost tabulky s rozložením stránky
- Výpočet a úspora místa v PostgreSQL