DB & AWS Knowledge
PostgreSQL 파티셔닝 데이터 기입법 본문
728x90
반응형
- PostgreSQL 의 파티션 테이블은 타 RDBMS 와는 이질적으로 부모-자식 간의 특이 테이블 유형을 보인다.
- 위의 항목 방법으로 테이블을 생성 한 후에는 개별적인 파티션에 데이터가 들어가도록 하기 위해서는 이에 대한 트리거를 아래와 만들어야 한다. (그 전에 개별 테이블들에 인덱스등의 오브젝트들은 미리 설정 해둔다.)
- (참조: https://www.postgresql.org/docs/9.4/ddl-partitioning.html)
- 예시
- 아래와 같이 파티션 테이블 (자식테이블) 을 만든다고 가정하자.
- 아래와 같이 파티션 테이블 (자식테이블) 을 만든다고 가정하자.
CREATE TABLE measurement_y2006m02 (
CHECK ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' )
) INHERITS (measurement);
CREATE TABLE measurement_y2006m03 (
CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' )
) INHERITS (measurement);
...
CREATE TABLE measurement_y2007m11 (
CHECK ( logdate >= DATE '2007-11-01' AND logdate < DATE '2007-12-01' )
) INHERITS (measurement);
CREATE TABLE measurement_y2007m12 (
CHECK ( logdate >= DATE '2007-12-01' AND logdate < DATE '2008-01-01' )
) INHERITS (measurement);
CREATE TABLE measurement_y2008m01 (
CHECK ( logdate >= DATE '2008-01-01' AND logdate < DATE '2008-02-01' )
) INHERITS (measurement);
-
- 각 테이블별로 먼저 인덱스를 설정한다.
- 각 테이블별로 먼저 인덱스를 설정한다.
CREATE INDEX measurement_y2006m02_logdate ON measurement_y2006m02 (logdate);
CREATE INDEX measurement_y2006m03_logdate ON measurement_y2006m03 (logdate);
...
CREATE INDEX measurement_y2007m11_logdate ON measurement_y2007m11 (logdate);
CREATE INDEX measurement_y2007m12_logdate ON measurement_y2007m12 (logdate);
CREATE INDEX measurement_y2008m01_logdate ON measurement_y2008m01 (logdate);
-
- 이제 각 파티션 테이블별로 데이터들이 기입되게 하기 위해서는 각 테이블별로 조건에 만족하는 데이터들이 들어가도록 트리거를 만들면 된다. 우선 아래와 같이 예시로 2008년 파티션 테이블에만 데이터가 들어 가도록 설정하면 아래와 같이 함수를 먼저 만든다. PostgreSQL 은 트러거를 수행하기 위해서는 함수를 먼저 만들어야 한다.
- 이제 각 파티션 테이블별로 데이터들이 기입되게 하기 위해서는 각 테이블별로 조건에 만족하는 데이터들이 들어가도록 트리거를 만들면 된다. 우선 아래와 같이 예시로 2008년 파티션 테이블에만 데이터가 들어 가도록 설정하면 아래와 같이 함수를 먼저 만든다. PostgreSQL 은 트러거를 수행하기 위해서는 함수를 먼저 만들어야 한다.
CREATE OR REPLACE FUNCTION measurement_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO measurement_y2008m01 VALUES (NEW.*);
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
-
- 그 후 원본 테이블 (부모 테이블) 에 데이터가 기입시 아래의 함수 조건을 따르도록 하는 트리거를 만들면 파티션 테이블 기능을 하는 파티션 테이블을 만들 수 있다.
- 그 후 원본 테이블 (부모 테이블) 에 데이터가 기입시 아래의 함수 조건을 따르도록 하는 트리거를 만들면 파티션 테이블 기능을 하는 파티션 테이블을 만들 수 있다.
CREATE TRIGGER insert_measurement_trigger
BEFORE INSERT ON measurement
FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();
-
- 위의 예시를 심화해서 실제 파티션 테이블과 같이 만든다면 아래과 같이 조건을 만들 수 있다.
- 위의 예시를 심화해서 실제 파티션 테이블과 같이 만든다면 아래과 같이 조건을 만들 수 있다.
CREATE OR REPLACE FUNCTION measurement_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.logdate >= DATE '2006-02-01' AND
NEW.logdate < DATE '2006-03-01' ) THEN
INSERT INTO measurement_y2006m02 VALUES (NEW.*);
ELSIF ( NEW.logdate >= DATE '2006-03-01' AND
NEW.logdate < DATE '2006-04-01' ) THEN
INSERT INTO measurement_y2006m03 VALUES (NEW.*);
...
ELSIF ( NEW.logdate >= DATE '2008-01-01' AND
NEW.logdate < DATE '2008-02-01' ) THEN
INSERT INTO measurement_y2008m01 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date out of range. Fix the measurement_insert_trigger() function!';
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
-
- PPAS 는 테이블 생성시 이와같은 과정의 트리거를 자동으로 만들어 준다. (PPAS Feature) (INSERT 1개, UPDATE 파티션/SUB 파티션 별로 1개씩)
반응형
'PostgreSQL > 파티셔닝' 카테고리의 다른 글
PostgreSQL 에서 파티셔닝 테이블 파라미터 적용 (0) | 2023.07.20 |
---|---|
PostgreSQL 및 PPAS 간의 생성 차이 (0) | 2021.03.07 |
Comments