[PostgreSQL] Table Partitioning

Ja L·2023년 4월 19일
0

AgensSQL/PostgreSQL

목록 보기
10/37

PostgreSQL Partitioning을 실습해봅니다.

Table을 생성합니다.

CREATE TABLE your_table (
date_column date
) ;

임의로 1000개의 날짜를 생성합니다.

INSERT INTO your_table (date_column) 
SELECT CURRENT_DATE - (random() * 365)::int * '1 day'::interval
FROM generate_series(1, 1000);

생성 구문을 보면 23년 4월 19일인 오늘의 날짜를 고려하면 2022~2023년 날짜만 생성됩니다.
Partitioning Table에는 Partitioned 기준이 되는 칼럼의 중복을 허용하지 않습니다.
중복값을 제거한 값을 새로운 테이블에 넣습니다.

CREATE TABLE your_table_ AS SELECT DISTINCT date_column FROM your_table ;

**
이제 your_table은 필요 없기때문에 drop하고 같은 이름으로 Partitioned Table을 만듭니다.

Partitioned table을 생성합니다.**

-- your_table삭제
DROP TABLE your_table ;

-- partitioned your_table 생성
CREATE TABLE your_table (date_column date) PARTITION BY RANGE (date_column) ; 

이제 partition 테이블을 생성합니다.

<주의> 날짜 범위 잡아줄 때 (MINVALUE) TO ('2022-12-31') / (2023-01-01') TO (MAXVALUE)로 했더니 2022년 12월 31일을 그 어느곳도 포함하지 못했다는 에러가 나왔다.
따라서 () To () 일때 뒤에있는 ()는 그 날짜 '이하'가 아닌 '미만'으로 설정된다.
따라서 날짜가 겹치도록 (그래야 실제로는 겹치지 않으니까) 설정해야한다.

-- my2022 테이블 생성 (2022년 자료만)
CREATE TABLE my2022 PARTITION OF your_table FOR VALUES FROM (MINVALUE) TO ('2023-01-01') ;

-- my2023 테이블 생성 (2023년 자료만) 
CREATE TABLE my2023 PARTITION OF your_table FOR VALUES FROM ('2023-01-01') TO (MAXVALUE) ;

partitioned table 인 your_table에 데이터를 넣어줍니다.

INSERT INTO your_table SELECT * FROM your_table_ ;

제 역할을 다 한 yourtable 도 삭제합니다.

DROP TABLE your_table_ ;

결과

현재 테이블 조회

            List of relations

Schema | Name | Type | Owner
--------+-------------+-------------------+-------
public | my2022 | table | agens
public | my2023 | table | agens
public | your_table | partitioned table | agens
(3 rows)


이제 partition이 잘 되었는지 확인해보자.

your_table 테이블의 경우 아래와 같다.

SELECT EXTRACT(year from date_column) AS year, COUNT(*) AS count FROM your_table GROUP BY year ;

year | count
------+-------
 2022 |   238
 2023 |   103
(2 rows)

2022 테이블의 경우 아래와 같다.

SELECT EXTRACT(year from date_column) AS year, COUNT(*) AS count FROM my2022 GROUP BY year ;

year | count
------+-------
 2022 |   238
(1 row)

my2023 테이블의 경우 아래와 같다.

SELECT EXTRACT(year from date_column) AS year, COUNT(*) AS count FROM my2023 GROUP BY year ;

year | count
------+-------
 2023 |   103
(1 row)

Table Partitioning 완료

profile
DB Engineer

0개의 댓글