sql >> Databáze >  >> RDS >> PostgreSQL

Vysvětlení velikostí řádků Postgres

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


  1. Jak importovat databázi pomocí phpMyAdmin

  2. Existuje v PostgreSQL něco jako funkce zip(), která kombinuje dvě pole?

  3. Použití Spotlight Cloud k vyřešení blokování serveru SQL

  4. Domovská stránka Oracle 10g express se nezobrazuje