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 |