[DB] 파티셔닝(Partitioning)

iniestar·2022년 6월 17일
0

1. 개요

우리는 서버를 운영하면서 많은 양의 데이터에 의해 속도저하를 느끼게 되는 경우가 종종 있다.
일반적으로, 하나의 데이터베이스에 데이터를 축적해 나가기 때문에 많으면 많을 수록 검색량이 증가하여 실제 운영에 영향을 미친다.
여기서, 많은양의 데이터가 쌓인 상태의 데이터베이스를 효율적으로 튜닝할 수 있을까를 생각해 볼 수 있다.
본 포스터에서는 이러한 궁금증을 해결하고자 파티셔닝이란 개념을 설명하고자 한다!

2. 파티셔닝이란?

파티셔닝이란, 하나의 테이블을 논리적 또는 물리적으로 나누어 데이터와 인덱스의 양을 최소화하여 검색 성능을 향상시키는 기법을 말한다.

파티셔닝에는 대표적으로 두 가지 기법이 존재한다.

첫 번째는 수평 파티셔닝(Horizontal Partitioning)이다.
수평 파티셔닝은 하나의 테이블을 데이터 개수를 기준으로 쪼개어 두 개의 다른 테이블로 저장하는 방식으로, 데이터의 양과 인덱스의 개수가 줄어들어 성능은 증가하지만 데이터 검색 시 복잡성이 증가된다는 단점이 있다. 추가적으로, 테이블이 아닌 서로다른 DB로 분산하는 방법을 샤딩(shading)이라고 한다.

두 번째는 수직 파티셔닝(Vertical Partitioning)이다.
수직 파티션은 자주 사용하는 컬럼을 기준으로 분산한다. 검색 시 필요없는 컬럼을 검색할 필요가 없기 때문에 검색 성능은 높아지지만 역시 테이블간의 연결성이 필요한 경우 검색 복잡도가 높아진다.

3. 사례

실제 사용하고 있는 Postgresql에서는 이러한 파티셔닝을 사용할 수 있도록 기능을 제공한다.
사용방법은 다음과 같다.

1) 파티션 적용대상 테이블명 변경

ALTER TABLE api_log RENAME TO api_log_temp;

2) 동일한 DB 테이블 스키마에 파티션 옵션을 설정하여 테이블 생성

  • 여기서는 테이블을 reg_date 기준으로 범위를 설정하고 테이블을 나누는 수평적인 전략을 가진다.
CREATE TABLE IF NOT EXISTS api_log
(
    id bigint NOT NULL DEFAULT nextval('api_log_seq'::regclass),
    data character varying(255),
    reg_date timestamp    
    CONSTRAINT api_log_pkey PRIMARY KEY (id)
) PARTITION BY RANGE (reg_date); //<- 파티션을 나눌 기준에 대한 옵션 설정, 여기서는 'reg_date'

3) 파티션 나눌 기준으로 파티션 생성

-- 파티션 생성
CREATE TABLE api_log_2022_01 PARTITION OF api_log FOR 
VALUES FROM('2022-01-01 00:00:00') TO ('2022-02-01 00:00:00');

-- 인덱스 생성
CREATE INDEX index_api_log_2022_01_id ON api_log_2022_01(reg_date); 

4) 기존 테이블에서 신규 테이블로 데이터 이전

INSERT INTO api_log 
(SELECT * FROM api_log_temp WHERE reg_date >= '2022-01-01' and reg_date <= '2022-02-01' );

여기까지 진행 했다면 api_log 테이블이 가지고 있는 파티션 테이블 하나가 생성될 것이다.
인덱스는 검색 방법에 따라 달라질 수 있으며 여기서는 등록 시간 기준인 'reg_date' 칼럼을 기준으로 인덱스를 설정 하였다.

마무리...

관리하는 서버의 데이터량이 많고 앞으로 더 많아 질것 같다! 하면 이렇게 해서 성능을 유지 또는 향상 시키는 것은 필수가 되어 간다.
추후에 이 글을 또 보며 공부를 계속해야 할 것 같다. 그럼...

profile
while(true) { 손가락 관절염++ };

0개의 댓글