레이블이 포그리인 게시물을 표시합니다. 모든 게시물 표시
레이블이 포그리인 게시물을 표시합니다. 모든 게시물 표시

2015년 11월 4일 수요일

데이터베이스(Postgresql)의 3가지 함수 형태 요약

Postgresql에서 정의할 수 있는 3가지 함수 형태이다.


  • IMMUTABLE (불변의)
    • 같은 입력값에 대해서는 항상 같은 결과값이 출력된다.
    • anyway,anytime 같은 값을 보장하며 산술 연산들이 여기에 해당된다.
    • 옵티마이저가 미리 계산해도 무방하다.
  • STABLE (정적인)
    • 같은 트랜잭션 내에서는 같은 입력값에 대해서 같은 결과를 출력한다.
    • current_timestamp와 같이 같은 트랜잭션 내에서 결과가 동일한 경우를 포함한다.
    • 옵티마이저 입장에서는 여러번의 콜을 한번으로 줄일 수 있다.
  • VOLATILE (휘발성의)
    • 매번 함수를 호출한다.
    • random(), curval() 함수처럼 미리 확신할 수 없다.
    • 대량의 row에 매번 적용되지 않도록 고민해야 한다.


트랜잭션이라는 논리적인 구성을 가지는 DB에서는 성능이나 편의성을 위해 최소한으로 필요한 요소들로 보인다.

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 생각이 간절 하네요.