2013-04-13 3 views
7

Ich speichere einige große XML-Dokumente in TEXT-Feldern in Postgres und ich versuche herauszufinden, wie effizient sie von TOAST komprimiert werden. Ich habe ein 2.2mb XML-Dokument, das auf 51kb gezippt werden kann, also möchte ich verstehen, wie nah die Komprimierungsrate von TOAST sein kann, um eine endgültige Entscheidung darüber zu treffen, wie ich diese Dokumente im Laufe der Zeit archivieren werde.Wie kann ich herausfinden, wie groß ein großes TEXT-Feld in Postgres ist?

Gibt es eine Funktion in Postgres, mit der ich die komprimierte TOAST-Größe einer bestimmten Spalte und Zeile so identifizieren kann?

Antwort

7

Sie möchten pg_column_size für TOASTed Größe, octet_length für geröstete Größe. pg_column_size ist in der system administration functions section of the documentation. Weitere Informationen finden Sie in der Dokumentation und this question.

Beispiel:

craig=> CREATE TABLE toastdemo(x text); 
CREATE TABLE 
craig=> insert into toastdemo(x) select * from repeat('abcdef',1000); 
INSERT 0 1 
craig=> select pg_column_size(x), pg_column_size(repeat('abcdef',1000)) FROM toastdemo; 
pg_column_size | pg_column_size 
----------------+---------------- 
      84 |   6004 
(1 row) 
+0

Danke! Basierend auf diesen Zahlen ist es sehr vergleichbar. Es hat ein 2.2mb-Dokument auf 81kb komprimiert, was perfekt für meine Bedürfnisse ist, verglichen mit extern gespeicherten Zip-Dateien. – brightball

+0

@aramisbear Das ist ungefähr das, was ich erwarten würde; TOAST verwendet ein einfaches LZ-Flavor-Komprimierungsschema mit niedrigen CPU-Kosten, nicht abgelaufenen Patenten und einem relativ niedrigen Komprimierungsverhältnis. Es gibt Diskussionen über das Verschieben von Deflates (das übliche Schema, das von Zip und Gzip verwendet wird) in der Zukunft, aber Sie erhalten ein ausreichend gutes Ergebnis mit dem vorhandenen Schema durch die Sounds. –

2

Sie können die Datei tatsächlich inspizieren:

SELECT oid AS table_name, reltoastrelid AS toast_tbl_name 
FROM pg_class 
WHERE oid = 'mytbl'::regclass 

Daraus ergeben sich die OID der Tabelle und den Toast Tisch mit ihm verbunden ist (falls vorhanden). Sie dienen als Dateinamen im Dateisystem in Ihrem Datenverzeichnis. Du kannst einfach gehen und nachsehen. In Ihrem Datenverzeichnis:

find . -name '216738' 

Und hier ist ein Zitat von the manual about the compression technique:

Die Kompressionstechnik verwendet wird, ist ein ziemlich einfaches und sehr schnelles Mitglied der LZ-Familie von Komprimierungstechniken. Details siehe src/backend/utils/adt/pg_lzcompress.c.