2013-04-13 2 views
7

나는 몇몇 큰 XML 문서를 Postgres의 TEXT 필드에 저장하고 있는데, TOAST가 그들을 얼마나 효율적으로 압축하고 있는지 알아 내려고하고있다. 나는 51MB까지 압축 할 수있는 2.2MB의 XML 문서를 가지고 있으므로, TOAST의 압축 비율이 어떻게 일치 하는지를 알고 싶다면 시간이 지남에 따라 이러한 문서를 보관하는 방법에 대한 최종 결정을 내릴 수 있습니다.Postgres에 큰 TEXT 필드가 얼마나 큰지 어떻게 알 수 있습니까?

Postgres에서 특정 열과 행의 TOAST 압축 된 크기를 식별 할 수있는 기능이 있습니까?

답변

7

토스트 크기의 경우 pg_column_size을 지정해야하며, 토스트되지 않은 크기의 경우 octet_length이 필요합니다. pg_column_sizesystem administration functions section of the documentation에 있습니다. 자세한 내용은 문서 및 this question을 참조하십시오.

예 :

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

고마워요! 이 숫자를 기반으로하면 매우 유사합니다. 그것은 외부 저장 zip 파일을 다룰 때보 다 내 필요에 가장 적합한 81MB로 2.2MB 문서를 압축했습니다. – brightball

+0

@aramisbear 그것은 내가 기대할 수있는 것입니다. TOAST는 만료되지 않은 특허가없고 낮은 압축비를 가진 간단한 LZ 풍미 압축 방식을 사용합니다. 앞으로는 수축 (zip과 gzip에 의해 사용되는 일반적인 계획)으로 이동하는 것에 대한 논의가 있었지만 기존의 계획으로는 소리로 충분히 좋은 결과를 얻고 있습니다. –

2

당신은 실제로 파일을 검사 할 수 있습니다 : (있는 경우)

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

이 테이블과 그와 관련된 토스트 테이블의 OID를 생산합니다. 이 파일은 데이터 디렉토리의 파일 시스템에서 파일 이름으로 사용됩니다. 가서보고 찾아 볼 수 있습니다. 데이터 디렉토리에서 :

사용되는 압축 기술은 압축 기술의 LZ 가족의 매우 간단하고 매우 빠른 회원 입니다 :

find . -name '216738' 

그리고 여기가 the manual about the compression technique에서 인용합니다. 자세한 내용은 src/backend/utils/adt/pg_lzcompress.c을 참조하십시오.

관련 문제