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?
Antworten:
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.quelle