2013-04-13 6 views
7

Sto memorizzando alcuni documenti XML di grandi dimensioni nei campi TEXT di Postgres e sto cercando di scoprire quanto TAST sia efficiente comprimendoli. Ho un documento XML 2.2mb che può essere compresso fino a 51kb, quindi voglio capire quanto vicino il rapporto di compressione di TOAST può eguagliarlo per prendere una decisione definitiva su come archiverò questi documenti nel tempo.Come posso scoprire quanto è grande un campo TEXT di grandi dimensioni in Postgres?

Esiste una funzione in Postgres che consentirà di identificare la dimensione compressa TOAST di una colonna specifica e di una riga come questa?

risposta

7

Si desidera pg_column_size per dimensioni TOAST, octet_length per dimensioni non saturi. pg_column_size è nel system administration functions section of the documentation. Vedi i documenti e this question per maggiori dettagli.

Esempio:

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

Grazie! Sulla base di questi numeri è molto comparabile. Ha compresso un documento da 2.2 MB fino a 81kb che è perfetto per le mie esigenze rispetto al trattamento con file zip archiviati esternamente. – brightball

+0

@aramisbear Questo è quello che mi aspetterei; TOAST utilizza un semplice schema di compressione LZ-flavor con basso costo della CPU, nessun brevetto non scaduto e un rapporto di compressione relativamente basso. C'è stata una discussione sul passaggio a sgonfiare (il solito schema usato da zip e gzip) in futuro, ma dai suoni si ottiene un risultato abbastanza buono con lo schema esistente. –

2

Si può effettivamente esaminare il file:

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

Questo produce l'OID della tavola e la tabella toast ad esso associato (se ne esiste uno). Servono come nomi di file nel file system nella directory dei dati. Puoi solo andare a cercarli. Nella vostra directory dei dati:

find . -name '216738' 

Ed ecco una citazione da the manual about the compression technique:

La tecnica di compressione utilizzata è un membro abbastanza semplice e molto veloce della famiglia LZ di tecniche di compressione. Vedi src/backend/utils/adt/pg_lzcompress.c per i dettagli.

Problemi correlati