2013-04-13 18 views
7

Przechowuję duże dokumenty XML w polach TEXT w Postgresie i próbuję dowiedzieć się, jak skutecznie kompresuje je TOAST. Mam dokument XML o wadze 2,2 MB, który można spakować do 51 kb, więc chcę się dowiedzieć, jak blisko współczynnik kompresji TOAST może go dopasować, aby podjąć ostateczną decyzję, w jaki sposób będę archiwizować te dokumenty w czasie.Jak mogę się dowiedzieć, jak duże jest duże pole tekstowe w Postgresie?

Czy w Postgres jest funkcja, która pozwoli mi zidentyfikować skompresowany rozmiar konkretnej kolumny i wiersza TOAST?

Odpowiedz

7

Chcesz pg_column_size dla rozmiaru TOASTed, octet_length dla niepasteryzowanego rozmiaru. pg_column_size jest w system administration functions section of the documentation. Więcej informacji znajduje się w dokumentach i this question.

Przykład:

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

Dzięki! Na podstawie tych liczb jest bardzo porównywalny. Skompresował on dokument o rozmiarze 2,2 mb aż do 81 kb, co jest idealne dla moich potrzeb w porównaniu do obsługi zewnętrznych plików zip. – brightball

+0

@aramisbear To jest to, czego bym się spodziewał; TOAST używa prostego schematu kompresji LZ z niskim kosztem procesora, brakiem niewygasających patentów i relatywnie niskim stopniem kompresji. Dyskutowano o przejściu na deflate (zwykły schemat używany przez zip i gzip) w przyszłości, ale otrzymujesz wystarczająco dobry wynik z istniejącym schematem przez dźwięki. –

2

Rzeczywiście można sprawdzić plik:

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

To daje OID stołu i stół tosty z nim związane (jeśli taki istnieje). Służą one jako nazwy plików w systemie plików w twoim katalogu danych. Możesz po prostu pójść i je sprawdzić. W katalogu danych:

find . -name '216738' 

A oto cytat z the manual about the compression technique:

Technika kompresji stosowany jest dość prosta i bardzo szybka członkiem rodziny LZ technik kompresji. Aby uzyskać szczegółowe informacje, patrz src/backend/utils/adt/pg_lzcompress.c.