본문 바로가기
DB/Postgre SQL

[PostgreSQL] 파티션테이블 생성

by 용술이 2021. 8. 26.
파티션 테이블 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE res_op_logs
(
    project_id    character varying(128NOT NULL,
    object_id    character varying(128NOT NULL,
    object_type    character varying(10NOT NULL,
    crt_date    date NOT NULL default current_date,
    log_type    character varying(10),
    log_data    text,
    reg_date    timestamp without time zone DEFAULT CURRENT_TIMESTAMP
) PARTITION  BY  RANGE (crt_date);
 
CREATE UNIQUE INDEX res_op_logs_idx_01 ON res_op_logs
( project_id,object_id,object_type,crt_date );
cs

 

새 파티션의 값이 하나 이상의 기존 파티션에 있는 값과 겹치도록 경계를 지정하면 오류가 발생한다. 이렇게 생성된 파티션은 모든 방법으로 일반적인 PostgreSQL 테이블이다. 각 파티션에 대한 테이블 스페이스 및 스토리지 매개 변수를 개별적으로 지정할 수 있다.

 

위의 예제의 경우 각 파티션은 한 번에 1년의 데이터를 삭제해야 하는 요구 사항과 일치하도록 테이블 생성 쿼리는 다음과 같다.

 

1
2
3
4
5
6
7
8
CREATE TABLE res_op_logs_y2021 PARTITION OF res_op_logs
    FOR VALUES FROM ('2021-01-01') TO ('2021-12-31');
 
CREATE TABLE res_op_logs_y2022 PARTITION OF res_op_logs
    FOR VALUES FROM ('2022-01-01') TO ('2022-12-31');
 
CREATE TABLE res_op_logs_y2023 PARTITION OF res_op_logs
    FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');
cs

생성후 테이블의 구조. 해당 테이블의 하위에 파티션으로 생성한 테이블이 위치한다.

 

 

실습
1
2
3
insert into res_op_logs values (1,1,'type', date('2021-06-30'), 'info', CURRENT_TIMESTAMP);
 
select * from res_op_logs;
cs

 

1
select * from res_op_logs_y2021; 
cs

부모테이블과 파티셔닝된 테이블들에서 조회할 수 있다. 

하지만 파티션이 없는 데이터를 입력하고자 하면 오류가 발생한다. 

1
insert into res_op_logs values (1,1,'type', date('2025-06-30'), 'info', CURRENT_TIMESTAMP);
cs

반응형

'DB > Postgre SQL' 카테고리의 다른 글

[PostgreSQL] 서비스 시작 및 중지  (0) 2021.08.26

댓글