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 완료