PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Rozumienie rozmiarów wierszy Postgres

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql COUNT(DISTINCT...) bardzo wolno

  2. Planeta PostgreSQL w galaktyce Ansible

  3. Jak działa Ceiling() w PostgreSQL

  4. Eksportuj określone wiersze z tabeli PostgreSQL jako skrypt INSERT SQL

  5. Sprawdź, czy wartość istnieje w tablicy Postgres