Komprimierte Tabellen

Hallo,

ich verwende Postgres noch nicht sehr lange, kenne daher nicht alle Funktionen genau. Per google hatte ich mal ausführlich nach der Möglichkeit gesucht, ob PostGres komprimierte Tabellen unterstützt. Dazu gab es aber nur mehrdeutige Aussagen und nun hoffe ich hier auf eine Antwort zu stoßen.

Hintergrund: Ich habe eine Tabelle mit zwei 64bit integer Zahlen in zwei Spalten. Die Tabellen sind aber leider extrem groß, wobei aber zumindest der erste Wert aufsteigend ist (fast immer um 1 erhöht, aber auch mit Sprüngen). Für einen Packer ist das ein gefundenes Fressen, komprimiert sind die Tabellen winzig. Jetzt ist die Frage, ob PostGres ebenfalls eine Komprimierung anbietet und damit umgehen kann. Performance spielt in diesem Fall übrigens keine große Rolle.

Über Antworten würde ich mich freuen,
Grüße,
Hendrik

PG komprimiert Datensätze, wenn dies sinnvoll ist. Das Verfahren nennt sich TOAST.
PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: TOAST

Hintergrund: Ich habe eine Tabelle mit zwei 64bit integer Zahlen in zwei Spalten. Die Tabellen sind aber leider extrem groß, wobei aber zumindest der erste Wert aufsteigend ist (fast immer um 1 erhöht, aber auch mit Sprüngen). Für einen Packer ist das ein gefundenes Fressen, komprimiert sind die Tabellen winzig. Jetzt ist die Frage, ob PostGres ebenfalls eine Komprimierung anbietet und damit umgehen kann. Performance spielt in diesem Fall übrigens keine große Rolle.

Über Antworten würde ich mich freuen,
Grüße,
Hendrik

In diesem Falle greift das nicht. Was ist der Grund, daß Du das komprimiert haben willst? Die Tabelle hat nur diese 2 INT-Spalten?


Andreas

Nachtrag:

Vielleicht solltest Du mal das Kapitel zu VACUUM lesen:

PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Routine Vacuuming

Möglicherweise hast Du nur massig viele tote Tupel.


Andreas

PostgreSQL komprimiert nicht über Datensätze hinweg, das würde auch wenig Sinn machen. Stell dir vor, die Datenbank müsste für den Zugriff auf einen einzelnen Eintrag erst mal die komplette Tabelle auspacken …

Wenn Performance unwichtig ist, wieso speicherst du nicht alle Daten in einem einzigen Text und springst die Positionen mittels Stringfunktionen an?

Erstmal danke für eure Antworten.

Erstmal vielleicht zum Verständnis die Gründe:
Die Tabelle wird als Matrix benutzt, die für eine Re-organisation von Werten zuständig ist. Wenn man sich ein 2D Array vorstellt, so sind in der Tabelle die linearen Addressierungswerte und dazugehörige die Alternative gespeichert. Nun wird über das alternative Index Schema iteriert und der lineare Wert nachgeschlagen.

Leider ist das alternative Indexschema sehr komplex zu berechnen und ich brauche die Indices aufsteigend.

Zur Laufzeit die Tabelle zu berechnen fällt definitiv aus. Textdateien würde bei der Datenmenge nicht handhabbar sein. Meine aktuelle Tabelle ist mehrere hundert Gigabyte groß. (Ich seh schon das Stirnrunzeln :wink: )

Nichts desto trotz: SQL bietet einige wesentliche Vorteile für mich:

  1. Die Erstellung der Tabelle geht relativ schnell, die Sortierung nach dem alternativen Indexschema geht quasi automatisch. In allen anderen Formen (textdatei), wäre hierfür viel Aufwand notwendig.

  2. Der Zugriff geht auch einigermaßen flott. Auch trotz dieser großen Datenbank! PG skaliert unwahrscheinlich gut :slight_smile:

  3. Ich kann von mehreren Clients auf die Tabelle zugreifen.


    Neben einer möglichen Kompression von PG aus gibt es noch die Möglichkeit, das Windows die Festplatte komprimiert. Das funktioniert auch schon sehr gut, ist aber schlechter als ZIP.

Grüße,
Hendrik

Aus dem Stehgreif würde ich nicht pauschal behaupten dass sich das nicht vernünftig in der DB lösen lässt, vor allem da du anscheinend immer nur einen Teil der Daten brauchst. Wenn ich das richtig verstanden habe.

Aber konkret kann ich dazu nur etwas sagen, wenn ich die Anwendung genauer sehen würde.