Toast

Hi Leute,

ich habe eine Frage, die von euch vermutlich sehr trivial vorkommt. Es geht um die Benutzung von Toast.


Ich habe eine Liste an Tabellen und eine Tabelle enthält lediglich 2 Felder. (key BIGINT, seq TEXT). Hierbei ist das Feld seq eine recht lange (zwischen 100-1000 Zeichen) Zeichenkette, die unveränderbar ist und auch nur selten benötigt wird. Genau diese Einträge möchte ich so stark wie es geht komprimieren. Hierfür bietet postgres TOAST an. Nun habe ich ein paar Zeilen (40000) in die Tabelle eingefügt aber ich habe nicht das Gefühl, dass die Daten in irgendeiner Weise komprimiert werden oder toast benutzt wird. In Pgadmin wird mir angezeigt: Table Size: 22 MB, Toast Table Size: 8192 Bytes.

Die Daten waren vorher ungepackt schon 19 MB groß. Wenn ich sie mit nem normalen Zip Programm packe kriege ich ungefähr 3MB raus. Warum wird TOAST also nicht benutzt?

Toast wird als extended benutzt; die Tabelle braucht ca. 3000 relpages; die Toast Table 0.

Vermutlich stelle ich mich einfach nur blöd an.

Jedenfalls muss dieses Feld komprimiert werden und wenn möglich einzeln gespeichert werden.

Grüße und Danke

MeisterU



The TOAST code is triggered only when a row value to be stored in a table is wider than TOAST_TUPLE_THRESHOLD bytes (normally 2 kB).

So steht es in der Doku…

Ob man das on-the-fly beeinflussen kann, hrm… Der Aufwand, Daten zu TOASTen, lohnt sicherlich erst, wenn eine gewisse Größe erreicht ist, daher dieses Verhalten.

Andreas

“toastable” Werte werden erst komprimiert wenn diese größer als 2KB sind, sonst wäre der Overhead wohl größer als der Gewinn (siehe PostgreSQL: Documentation: Manuals: PostgreSQL 9: TOAST)

Diesen Schwellenwert (2KB) kann man - soweit ich das im Kopf habe - nur beim neu kompilieren von Postgres ändern.