From: | Andreas Seltenreich <uwi7(at)rz(dot)uni-karlsruhe(dot)de> |
---|---|
To: | Alvar Freude <alvar(at)a-blast(dot)org> |
Cc: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Speicherverbrauch / c't Datenbank-Contest |
Date: | 2005-11-13 16:19:08 |
Message-ID: | 87mzk8ed1f.fsf@gate450.dyndns.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-de-allgemein |
Alvar Freude writes:
> leider komme ich erst jetzt zu den Letzten Zügen ;) beim c't
> Datenbank-Contest; für die mittelgroße Datenbank dürften auch
> Kleinigkeiten im Speicherverbrauch interessant sein, daher frage ich
> mich, ob ich die "customers"-Tabelle in zwei aufteile: eine, in die die
> Daten geschrieben werden, und eine Login-Tabelle, auf die im sonstigen
> verlauf zugegriffen wird.
Aus Sicht des relationalen Entwurfs ein klares "das ist böse", aus
Sicht der Optimierung ein klares "könnte was bringen" :-).
> Die customers-Tabelle hat im Falle der mittelgroßen Datenbank 2
> Millionen Zeilen. Beim Login und via Foreign Keys beim Bestellen wird
> darauf zugegriffen.
Speziell bei foreign Keys spielt die Tupelgröße keine Rolle, da dazu
nur ein Indexzugriff nötig ist, und Indexe getrennt von den Daten und
anderen Indexen gehalten werden.
> Postgres lädt immer die ganze Zeile, oder wird das spaltenweise abgelegt
> (und reingeladen)?
Depends. Bei deiner customers-Tabelle würde ich ersteres sagen;
Getoastete Typen können jedoch auch Out-Of-Band gehalten werden.
> Weiß gerade jemand Zahlen, wieviel das hier pro Zeile braucht, wenn in
> den Varchar-Feldern zwischen 6 und 20 Bytes stehen? Oder gibt es
> vielleicht einen Query über den Systemkatalog, mit dem man den
> Speicherverbrauch einer Zeile (oder einer Tabelle) errechnen kann? Ich
> bin etwas spät, sonst würde ich es einfach ausprobieren ;)
Du kannst Daten oder auch ganze Records durch die passende
length(foo_send()) jagen. Das müßte dann genau dem entsprechen, was
auf der Platte landet minus Seitenheader.
Beispiel:
--8<---------------cut here---------------start------------->8---
scratch=# select *, length(record_send(foo)) from foo;
bar | length
--------------------------------------------------+--------
foo | 15
foo bar | 19
foo bar bazzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz | 60
(3 rows)
scratch=#
--8<---------------cut here---------------end--------------->8---
HTH
Andreas
From | Date | Subject | |
---|---|---|---|
Next Message | Guido Neitzer | 2005-11-13 16:24:28 | Re: Speicherverbrauch / c't Datenbank-Contest |
Previous Message | Alvar Freude | 2005-11-13 15:11:51 | Speicherverbrauch / c't Datenbank-Contest |