Schätzung der Größe (der Datensätze) und des Overheads in Postgres

7

Betrachten Sie die folgende Tabelle in Postgres 9.4:

CREATE TABLE t
(
  a1 bigserial,
  a2 bigint NOT NULL,
  a3 bigint NOT NULL,
  a4 integer, 
  a5 timestamp with time zone NOT NULL,
  a6 timestamp with time zone NOT NULL DEFAULT now(),
  a7 bigint NOT NULL,
  a8 bigint NOT NULL,
  a9 real,
  a10 integer,

  CONSTRAINT kkkey PRIMARY KEY (a1)
)

Was sind die geschätzten Kosten zum Speichern dieser Tabelle?

Ein Rekord kostet:

size(bigserial) 
+ size(bigint) 
+ size(bigint) 
+ size(integer) 
+ size(timestamp) 
+ size(timestamp) 
+ size(bigint) 
+ size(bigint) 
+ size(real) 
+ size(integer)
= 8 + 8 + 8 + 4 + 8 + 8 + 8 + 8 + 4 + 4 = 68 bytes

Das Datenbankseitenlayout von Postgres enthält ziemlich detaillierte Informationen darüber, wie die Datensätze im Sekundärspeicher landen, aber ich bin nicht sicher, wie alle Zahlen zusammengefügt werden sollen.

Die Linux-Berichte

blockdev --getbsz /dev/sda1
1024

Fragen:

(1) Gibt es Hilfsfunktionen zur Bewertung der Speicherkosten pro Zeile (so dass diese komplizierten Berechnungen nicht von Hand durchgeführt werden müssen)?

(2) Wie werden die Zahlen zusammengestellt, dh die Gemeinkosten für jede Zeile geschätzt?

(3) Wie werden die Kosten für den Primärschlüsselindex geschätzt?

Arthur
quelle
Schauen Sie sich diese Antwort an , um mehr darüber zu erfahren, wie Postgres Daten speichert.
Vyegorov

Antworten:

7

Funktionen, die die Größe von Spalten, Tabellen und Indizes angeben, sind im Handbuch dokumentiert: http://www.postgresql.org/docs/9.4/static/functions-admin.html

Es gibt keine Funktion zum Berechnen der Größe eines gesamten Datensatzes (während es eine Funktion zum Erkennen der Speicherkosten eines einzelnen Datenwerts gibt ( pg_column_size)), da Datensätze im Allgemeinen eine variable Länge haben (manchmal sind sie komprimiert), denke ich Sie haben zwei Möglichkeiten: Führen Sie entweder eine Katalogabfrage durch, um alle Größen der Spalten einer Tabelle zusammenzufassen, oder ermitteln Sie einfach die Größe einer aufgefüllten Tabelle und dividieren Sie sie durch die Anzahl der Datensätze, um eine durchschnittliche Größe für den Datensatz zu erhalten.

Renzo
quelle
1
Man muss auch beachten, dass PostgreSQL immer ganze Seiten verwendet, sodass eine einzelne Zeile der obigen Struktur oder 50 davon immer noch 8 kB Speicherplatz beanspruchen (nur auf der Tabelle). Wenn der Tisch größer wird, wird dieser Effekt kleiner. Darüber hinaus werden Indizes sehr ähnlich wie Tabellen gespeichert, es gibt immer einen Seitenkopf (+ Auffüllen nach Bedarf) und Zeilenüberschriften. Ein neu erstellter Index mit 999903 Ganzzahlwerten (PK) benötigt beispielsweise 22478848 Byte in meiner lokalen Testbox.
Dekso