본문 바로가기

개발 지식/DB

[PostgreSQL] 테이블 Range Partition 정리

반응형

[PostgreSQL] 테이블 Range Partition 정리

개소리

현재 회사에서 모든 제품들의 로그를 공통화 시키는 서버를 개발하는 중에 있어서, 로그 데이터들에 대한 관리를 월별로 할 것이라고 같은 제품을 맡으신 분께서 전달을 해주셨다. 월별로 관리를 한다는 것이 날아오는 테이블에 월별 컬럼을 따로 하나 더 만들어주나보다 하고 생각을 했었다. 근데 확실히 나는 개발 개허접인게 파티셔닝이라는게 있는지도 몰랐었다.

이런 내 상황을 기가막히게 캐치하고 내 사수라고도 할 수 있는 분께서 파티셔닝을 알아보라고 말씀해주셔서 공부를 후다닥 했었다. 그게 벌써 3달전인데 이제 정리를 한다.


Partition 이란?

로그 데이터들은 보통 방대하기 때문에 일단 쌓고 본다. 근데 나중에 이러한 방대한 데이터들을 검색할 시, 한 테이블에 모든 로그 정보를 쌓다보면 쿼리 성능이 상당히 안좋게 나올것이다. 따라서 이 방대한 데이터들을 여러 테이블에 나누어서 Insert를 해야하고 관리를 하며, 이러한 테이블들에 쿼리를 날린다.

근데 이렇게 나누는 작업들을 다 개발자단에서 수동으로 처리하는 일종의 스킬이라고 생각한다면 나를 알아주는 오산대학교다.

들어온 데이터들에 대해서 자동으로 나눠서 테이블들에 insert를 해줄 수 있게 DB에서 제공하는 기능이 바로 Partition 그 중에 범위(Range) 로 Patition 의 조건을 정의 해주는 것이 바로 Range Partition이다.

Range Partition에 대해서도 정리해야 할 내용이 많지만, 우선은 나같은 경우처럼 기간을 기준으로 테이블을 파티션 한다면, 기준으로 삼으려는 그 기간동안의 데이터 양을 잘 고려해야 한다는 것이다. 여기 에 해당 내용이 자세하게 나와있으니 한번 읽어보면 좋을듯하다.

Range Partition 방법

PostgreSQL 12.2 버전을 사용했습니다.

우선 테이블을 만든다. 다음과 같이 PARTITION BY RANGE (log_date) 라는 키워드를 마지막에 작성해준다.

예시로 1월부터 3월까지의 파티셔닝 된 테이블을 다음과 같이 만들어준다.

각각의 range partition 기준키인 log_date 를 가지고 각각의 테이블에 인덱스를 생성해주고, \d 테이블명 으로 인덱스가 잘 걸려있는지 확인해준다.

Range Partition 활용

1월, 2월, 3월 데이터를 넣어두고 쿼리를 날려보면 다음과 같이 각 테이블을 스캔해서 가져오는 것을 알 수 있다.
(인덱스를 걸어두었음에도 불구하고 Seq Scan으로 나오는 것은 다음을 참고!)

4월 데이터를 넣으면 다음과 같이 에러를 뱉어낸다!

반응형