데이터베이스에서 성능을 개선하고 데이터를 효과적으로 관리하기 위한 방법 중 하나로 테이블 파티셔닝이 널리 활용되고 있다.
이 글에서는 데이터베이스 초보자도 쉽게 이해할 수 있도록, 파티셔닝의 개념부터 실제 예시, 그리고 사용 시 주의해야 할 사항까지 단계적으로 설명하고자 한다.
1. 파티셔닝이란 무엇인가
파티셔닝(Partitioning)이란, 하나의 큰 테이블을 논리적으로 분할하여 여러 개의 작은 단위(파티션)에 나누어 저장하는 기술이다.
이때 나누어진 각 단위는 **파티션(partition)**이라고 불리며,
사용자 입장에서는 여전히 하나의 테이블처럼 보이지만, 내부적으로는 각 파티션별로 독립적인 저장 및 처리가 이뤄진다.
이 개념은 마치 한 권의 두꺼운 책을 여러 권의 얇은 책으로 나누는 것과 유사하다.
예를 들어 대학 전공서적을 챕터 단위로 나누어 제본하면, 필요한 부분만 들고 다닐 수 있어 훨씬 효율적인 것처럼,
파티셔닝을 통해 테이블을 논리적으로 쪼개면 처리 속도, 유지보수, 백업 등의 측면에서 장점이 커진다.
예를 들어, 1년치 주문 데이터를 담고 있는 orders 테이블이 있다고 가정해보자.
이 테이블은 하루 수천 건의 주문 데이터를 계속 누적하게 되며, 시간이 지날수록 점점 커지게 된다.
만약 이 테이블을 월별 파티션으로 나누면,
- 2025년 1월의 주문은 p2025_01
- 2월의 주문은 p2025_02
와 같이 별도의 파티션에 저장되므로, 특정 월 데이터를 조회할 때 해당 월의 파티션만 빠르게 검색할 수 있다.
2. 파티셔닝을 왜 사용해야 하는가
파티셔닝은 단순한 저장 구조 변경이 아닌, 성능 개선과 데이터 운영 효율성을 높이는 전략적 수단이다.
1) 쿼리 성능 향상
특정 범위의 데이터만 조회할 경우, 전체 테이블을 탐색하는 대신 해당 파티션만 검색하므로 속도가 크게 향상된다.
예:
"2025년 2월 주문만 검색" 시 → p2025_02 파티션만 조회하면 됨
2) 데이터 관리 효율화
- 보관 주기 도래한 파티션만 삭제하거나
- 특정 기간 파티션만 백업하는 등
테이블 전체를 건드리지 않고도 부분적 유지보수가 가능하다.
3) 백업 및 보안 유연성
- 민감한 데이터가 포함된 파티션만 별도로 암호화하거나
- 특정 파티션만 별도로 저장할 수 있어 보안 및 재해복구 측면에서도 유리하다.
3. 파티셔닝의 대표적인 종류
파티셔닝에는 여러가지 방식이 있으며, 사용 목적과 데이터 특성에 따라 적절한 방식을 선택해야 한다.
1) Range 파티셔닝 : "구간"으로 나누는 방식
값이 연속적인 범위를 가지는 컬럼을 기준으로 데이터를 나누는 방식이다. 주로 날짜, 금액, 나이처럼 연속된 값을 갖는 컬럼에 적합하다.
예를 들어, 주문일자를 기준으로 파티션을 나누면 다음과 같다.
PARTITION BY RANGE (order_date) (
PARTITION p2025_01 VALUES LESS THAN('2025-02-01'),
PARTITION p2025_02 VALUES LESS THAN('2025-03-01')
);
이 경우 1월의 주문은 p2025_01, 2월의 주문은 p2025_02에 저장된다.
장점
- 특정 범위(예: 월별, 분기별) 데이터 조회에 매우 빠름
- 오래된 데이터만 손쉽게 삭제 또는 보관 가능
주의
- 구간 설정이 겹치지 않도록 설계 필요
- 새로운 구간이 필요할 경우, 수동으로 파티션 추가 필요
2) List 파티셔닝 : "명확한 값 목록"으로 나누는 방식
컬럼 값이 특정 목록 중 하나일 때, 그 값을 기준으로 나눈다.
국가, 지역, 상품 종류처럼 명확하게 구분되는 경우에 적합하다.
예를 들어 국가별로 나누는 경우 다음과 같다.
PARTITION BY LIST (contry) (
PARTITION korea VALUES ('KOREA'),
PARTITION usa VALUES ('USA'),
PARTITION etc VALUES DEFAULT
);
이 경우, contry = 'KOREA'인 데이터는 korea 파티션에, contry = 'USA'인 데이터는 usa 파티션에, 나머지는 etc로 간다.
장점
- 특정 그룹에 속한 데이터만 빠르게 조회 가능
- 국가, 도시, 상품군 같이 "카테고리성 데이터"에 유리
주의
- 가능한 값을 미리 정의해야 함
- 새로운 값 등장 시 DDL 수정 필요
3) Hash 파티셔닝 : "자동 분산" 방식
파티션 키에 해시 함수를 적용해 데이터를 균등하게 자동 분산한다.
데이터 값이 예측 불가능하거나 고르게 퍼져야 할 때 사용한다.
예시는 다음과 같다.
PARTITION BY HASH(user_id)
PARTITIONS 4;
user_id를 해시함수에 넣고 그 결과에 따라 4개 파티션 중 하나에 자동으로 저장한다.
장점
- 값의 범위나 목록을 몰라도 사용 가능
- 자동 분산이라 성능이 고르게 유지됨
주의
- 특정 값을 기반으로 한 조회에는 비효율적
- 파티션 수 변경이 어려움 (테이블 재구성 필요)
4) Composite 파티셔닝 : 복합 기준으로 나누는 방식
Range, List, Hash 파티셔닝을 두 개 이상 조합하여 사용하는 방식이다.
복잡한 조건의 데이터를 더 효율적으로 다룰 수 있다.
예를 들어 1차로 연도 기준으로, 2차로 국가 기준으로 나누는 경우 다음과 같다.
PARTITION BY RANGE (order_date)
SUBPARTITION BY LIST (country)
(
PARTIOTION p2025_01 VALUES LESS THAN ('2025-02-01') (
SUBPARTITION korea VALUES ('KOREA'),
SUBPARTITION usa VALUES ('USA')
)
);
이 경우, 2025년 1월 주문 중에서도 국가에 따라 세부적으로 분류 된다.
장점
- 복잡한 쿼리에 최적화된 구조 설계 가능
- 성능과 유연성 모두 확보 가능
주의
- 설계 복잡도 높음
- 실무에서는 DBA의 사전 검토 및 경험이 필수
4. 실제 적용 예시
아래는 사용자 로그 테이블을 월별로 나누어 저장하는 구조의 예시이다.
CREATE TABLE user_logs(
log_id INT,
user_id INT,
log_date DATE,
country VARCHAR(20),
activity TEXT
)
PARTITION BY RANG (log_date) (
PARTITION p2025_01 VALUES LESS THAN ('2025-02-01'),
PARTITION p2025_02 VALUES LESS THAN ('2025-03-01'),
PARTITION p2025_03 VALUES LESS THAN ('2025-04-01')
);
위 예시는 사용자 로그 데이터를 월별로 분할 저장한 것이다.
- 2025년 2월 로그만 빠르게 조회할 수 있고
- 2025년 1월 로그만 따로 삭제하거나 백업하는 작업이 가능해진다.
5. 주의할 점
파티셔닝은 강력한 기능이지만, 적절히 사용하지 않으면 오히려 성능이 저하되거나 관리가 복잡해질 수 있다.
- 파티션 키 선택은 매우 중요하다.
자주 조회하거나 필터링 되는 컬럼을 기준으로 파티셔닝 해야 의미가 있다. 잘못된 키를 기준으로 나누면 효과가 없다. - 너무 많은 파티션을 만들면 오히려 성능이 떨어질 수 있다.
예를 들어, 일 단위로 수천 개의 파티션을 생성하면 관리와 쿼리 비용이 증가한다. - 인덱스 관리와 조인 성능 문제도 고려해야 한다.
파티션마다 인덱스를 따로 관리해야 하며, 파티셔닝된 테이블과 다른 테이블 간의 조인에서 성능 이슈가 발생할 수 있다.
6. 마치며
테이블 파티셔닝은 단순한 테이블 분할이 아닌, 성능과 유지보수의 전략적 수단이다.
설계 시 데이터 특성과 쿼리 패턴을 충분히 고려하여, 적절한 파티셔닝 방식과 파티션 키를 선택해야 진정한 효과를 얻을 수 있다.
실무에서는 초기에는 Range 또는 List 방식으로 시작하고, 데이터가 복잡해질 경우 Composite 파티셔닝으로 확장하는 방식이 일반적이다.
DBMS에 따라 지원하는 파티셔닝 기능에 차이가 있으므로, 실제 적용 전에는 반드시 공식 문서와 테스트 환경에서 검증하는 것이 바람직하다.
'Develop > Data Engineering' 카테고리의 다른 글
Apache NiFi 고급 활용 가이드: 증분 수집부터 다중 전송까지 (0) | 2025.07.08 |
---|---|
Apache NiFi로 DB to DB 데이터 연동 자동화하기 (0) | 2025.07.07 |
웹 크롤링에 대해 알아보자 (0) | 2025.04.16 |
HDFS 개요 (0) | 2025.03.23 |
Hadoop 개요 (0) | 2025.03.23 |