2015년 7월 21일 화요일

PostgreSQL의 대형 속성 저장 기술 (TOAST) 요약

PostgreSQL의 데이터 용량 관리에 대해서,


최근에 작업한 80만건 정도의 웹크라울링 데이터의 작업 중에,
흥미로운 이야기가 있어서 소개 합니다.

PostgreSQL 9.4 버전에서 메타(META)과 함께 HTML 페이지를 보관 할때,
* DB 사이즈가 30G
* 덤프(pg_dump)의 압축레벨 1로 압축 파일을 생성 했을때 사이즈가 22GB
* 압축을 풀었을때 파일 사이즈가 90G

코끼리는 기본적으로 가변 타입에서 8k를 넘는 문자열을 압축해서 보관하고,
관련 기술은 TOAST라 불립니다.

TOAST(대형 속성 저장 기술:The Oversized-Attribute Storage Technique)

 - 참고자료 : http://www.postgresql.org/docs/9.4/static/storage-toast.html
 - 요약
 * 8kB가 넘는 데이터에 대해서 TOAST 적용됨
 * 성능에 주안을 둔 LZ 압축 기술 사용
 * 한개의 오브젝트가 논리적으로 1GB까지 지원
 * (주테이블과 TOAST 테이블이 분리되어 있음으로) TOAST 테이블 연관 속성을 조회 하지 않을때는 조회 성능에 이슈가 없음

백문이 불여일견이라, DB 관리자 분들을 위해서 조회 쿼리와 함께 내용을 정리해 봅니다.

순수하게 주테이블에 대한 사이즈를 조사합니다.

cook=> select pg_size_pretty(pg_relation_size('web_crawling_news'));
 pg_size_pretty 
----------------
 210 MB
(1 row)
=> TOAST에 해당되는 속성이 없을 때는, 매우 빠른 조회가 가능합니다.

INDEX나 TOAST 같은 연관 테이블을 합산해서 조사합니다.

cook=> select pg_size_pretty(pg_total_relation_size('web_crawling_news'));
 pg_size_pretty 
----------------
 30 GB
(1 row)

주테이블과 연관된 TOAST 테이블을 조사합니다.

cook=> select relname from pg_class where oid in ( select reltoastrelid from pg_class where relname = 'web_crawling_news');
     relname      
------------------
 pg_toast_3419091
(1 row)

TOAST 테이블의 사이즈를 조사합니다.

cook=# select pg_size_pretty(pg_relation_size('pg_toast.pg_toast_3419091'));
 pg_size_pretty 
----------------
 30 GB
(1 row)

TOAST 테이블의 내부 속성들 입니다.

cook=> \d+ pg_toast.pg_toast_3419091
TOAST table "pg_toast.pg_toast_3419091"
   Column   |  Type   | Storage 
------------+---------+---------
 chunk_id   | oid     | plain
 chunk_seq  | integer | plain
 chunk_data | bytea   | plain

점심을 패스해서 그런지 TOAST 생각이 간절 하네요.

0 개의 댓글:

댓글 쓰기