PostgreSQL Partition Table

2021. 11. 9. 13:29카테고리 없음

728x90

 

로고
로고

 

PostgreSQL에서 Partition Table을 만드는 방법은 상당히 쉽다.

 

Partition을 왜?? 만들어 사용할까?

그 이유는 대량의 데이터를 저장할 때 하나의 Table에만 데이터를 저장한다고 가정을 하면, SELECT 할 때나 Update, Delete시 자료량이 많기 때문에 Table은 느려지고 비효율이 발생한다.

 

그래서 오늘은 날짜 기반으로 데이터를 테이블 단위로 저장하는 방법을 정리한다,

 

Partition Table을 만드는 방법은 아래와 같다

1. Range Partitioning

2. List Partitioning

3. Hash Partitioning

 

 

Range Partitioning 은 특정 범위의 데이터가 저장되도록 하는 방법으로, 내가 주로 사용하는 방법이다

예를 들면 날짜별로 데이터를 관리하는데 유용하다.

 

특정 Data를 날짜별로 저장하고 싶을 때는 주 Table을 먼저 생성해야 된다,,

 

CREATE TABLE log(
    uid BIGINT
    log_name VARCHAR(32),
    log_text TEXT,
    log_time TIMESTAMP
) PARTITION BY RANGE (log_time);

 

일반적인 PARTITION BY RANGE 뒤에 log_time 칼럼 기준으로 Data를 저장한다.

방금 만든 log Table에는 데이터를 저장할 수없고, 범위를 지정하는 Partition 테이블을 만들어야 저장이 가능하다

 

그럼 부모 Table을 만들었으니 그 아래로 Partition 테이블을 만들어보자

 

CREATE TABLE log_20211201 PARTITION OF log
    FOR VALUES FROM ('20211201') TO ('20211202');

 

위와 같이 Partition Table을 하나 만들었다..

Table 이름은 log_21211201이고 Data가 들어가는 범위는 2021-12-01 00:00:00부터 2021-12-01 23:59:59까지이다.

 

조회할 때는

SELECT * FROM log;

 

그럼 하위에 Partition Table까지 모두 조회가 가능하다..

 

Partition Table을 미리 해당 날짜만큼 만들어 놓거나 배치 프로그램을 만들어서 하루에 한 번 수행해서 다음날 Partition을 만들어 놓으면 편리하다.

물론 Data 저장 주기에 따라 해당 Partition을 삭제해 주면 Disk Full을 방지할 수 있다.

 

Partition Table을 삭제하려면 

 

DROP TABLE log_21211201;

이렇게 하면 된다.

 

그런데~~~ 주의할 점 한 가지

SELECT를 할 때 WHERE 조건에 log_time =? 이런 식으로 binding을 할 때 static 변수가 아니면 Full Scan을 하는 버그가 있으니, 주의가 필요하다.

 

 

explain SELECT * FROM log WHERE log_time =?;

 

으로 Plan을 확인해보면 Function (Procedure) 등에서 조회를 구현할 때 확인해 보길...

 

 

 

반응형