Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

PostgreSQL 파티셔닝 데이터 기입법 본문

PostgreSQL/파티셔닝

PostgreSQL 파티셔닝 데이터 기입법

`O` 2021. 3. 7. 23:49
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 은 트러거를 수행하기 위해서는 함수를 먼저 만들어야 한다.
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개씩)
반응형
Comments