1. 테이블 파티션의 종류

   - Vertical table partitoning 

   - Horizontal table partitioning 


2. 테이블 파티션 구성 방법

   1) proxy 역할을 할 parent table 생성

CREATE TABLE log (

  log_id SERIAL PRIMARY KEY,

  log_information JSONB,

  log_type CHAR(1) 

);

   2) 데이터를 저장할 child tables 생성

CREATE TABLE log_u ( CHECK ( log_type = 'u') ) INHERITS (log);

CREATE TABLE log_i ( CHECK ( log_type = 'i') ) INHERITS (log);

CREATE TABLE log_d ( CHECK ( log_type = 'd') ) INHERITS (log);

   3) 파티션 기준에 따라 child tables에 데이터 저장하는 trigger 및 rule 생성

CREATE OR REPLACE FUNCTION log_insert() RETURNS TRIGGER AS $$

BEGIN

    IF ( NEW.log_type = 'u' ) THEN

        INSERT INTO log_u VALUES (NEW.*);

    ELSIF ( NEW.log_type = 'i' ) THEN

        INSERT INTO log_i VALUES (NEW.*);

     ELSIF ( NEW.log_type = 'd' ) THEN

        INSERT INTO log_d VALUES (NEW.*);

    ELSE

        RAISE EXCEPTION 'Unknown log type';

    END IF;


    RETURN NULL;

END;

$$ LANGUAGE plpgsql;



CREATE TRIGGER log_insert

    BEFORE INSERT ON log

    FOR EACH ROW EXECUTE PROCEDURE log_insert();


INSERT INTO log (log_information, log_type) VALUES ('{"query": "SELECT 1", "user":"x" }', 'i');

INSERT INTO  log (log_information, log_type) VALUES ('{"query": "UPDATE ...", "user":"x" }', 'u');


   4) child tables에 check constraints 생성

   5) 실행계획 확인

      EXPLAIN SELECT * FROM log WHERE log_type='i';

                          QUERY PLAN

------------------------------------------------------------

 Append  (cost=0.00..1.01 rows=2 width=44)

   ->  Seq Scan on log  (cost=0.00..0.00 rows=1 width=44)

         Filter: (log_type = 'i'::bpchar)

   ->  Seq Scan on log_i  (cost=0.00..1.01 rows=1 width=45)

         Filter: (log_type = 'i'::bpchar)

'RDB > PostreSQL' 카테고리의 다른 글

Postgresql 버전 Upgrades  (0) 2016.04.01
Postgresql 백업 및 복구  (0) 2016.03.31
postgresql 실행계획  (0) 2016.03.25
PostgreSQL 보안  (0) 2016.03.22
postgresql index  (0) 2016.03.17

+ Recent posts