180. 레인지 파티셔닝 (Range Partitioning) - 범위 기준 분할
핵심 인사이트: 세상에서 가장 흔하게 쓰이는 파티셔닝 기법이다. "2023년 데이터는 1번 서랍에, 2024년 데이터는 2번 서랍에 넣어라"처럼, 날짜나 숫자 같은 '연속된 범위(Range)'를 기준으로 데이터를 썰어버리는 직관적이고 강력한 방법이다.
Ⅰ. 레인지 파티셔닝(Range Partitioning)의 개념
테이블의 파티션 키(Partition Key) 컬럼이 가지는 값의 범위(Range) 를 기준으로 데이터를 분할하여 서로 다른 물리적 파티션에 저장하는 기법입니다. 대부분의 대용량 테이블은 시간에 따라 데이터가 누적되는 이력(History) 성격을 띠므로, '날짜(Date/Timestamp)' 컬럼을 파티션 키로 사용하는 것이 실무에서 90% 이상을 차지합니다.
Ⅱ. 레인지 파티셔닝의 구조 및 생성 예시
CREATE TABLE sales_history (
order_id NUMBER,
order_date DATE,
amount NUMBER
)
PARTITION BY RANGE (order_date) ( -- ◀ 파티션 기준(키) 설정
-- 2023년 데이터 파티션
PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')),
-- 2024년 데이터 파티션
PARTITION p_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')),
-- 향후 들어올 예외/미래 데이터 처리용 (필수 권장)
PARTITION p_max VALUES LESS THAN (MAXVALUE)
);
- DB 엔진은
INSERT되는 데이터의order_date를 검사하여, 2023년 12월 25일 데이터면 알아서p_2023파티션에 집어넣습니다.
Ⅲ. 레인지 파티셔닝의 극적인 장점 (실무 활용)
- 완벽한 파티션 프루닝 (조회 성능 최적화)
- "2024년 5월 매출을 조회하라"는 쿼리(
WHERE order_date BETWEEN ...)가 들어오면, 옵티마이저는 전체 테이블 10년 치를 다 뒤지지 않고 오직p_2024파티션만 쏙 골라서(Pruning) 읽어냅니다.
- "2024년 5월 매출을 조회하라"는 쿼리(
- 보관 주기(Retention) 관리의 마법 (DROP PARTITION)
- "법적 보관 기간이 끝난 5년 전(2018년) 데이터를 삭제해라"라는 요건이 있을 때,
DELETE FROM ... WHERE YEAR='2018'를 치면 언두(Undo) 로그가 꽉 차고 DB가 뻗습니다. - 하지만 레인지 파티셔닝이 되어 있다면
ALTER TABLE ... DROP PARTITION p_2018명령어 단 한 줄로, DDL 차원에서 1초 만에 테라바이트급 데이터를 안전하게 날려버릴 수 있습니다.
- "법적 보관 기간이 끝난 5년 전(2018년) 데이터를 삭제해라"라는 요건이 있을 때,
Ⅳ. 주의사항
- 파티션 키 값(날짜 등)을 잘못 설계하면 특정 파티션에만 데이터가 비정상적으로 몰리는 데이터 쏠림(Data Skew) 현상이 발생할 수 있습니다.
- 조건절(
WHERE)에 파티션 키 컬럼을 사용하지 않거나, 컬럼을 가공(TO_CHAR(order_date) = '2024')해버리면 프루닝이 동작하지 않고 전체 파티션을 스캔합니다.
📢 섹션 요약 비유: 수만 장의 영수증이 든 상자를 뒤적이는 대신, 영수증 묶음을 '1월 바인더', '2월 바인더', '3월 바인더'로 분리해 두는 것(레인지 파티셔닝)입니다. "올해 2월 매출 찾아와!" 하면 다른 달 바인더는 쳐다보지도 않고 딱 2월 바인더만 빼오면 되며(파티션 프루닝), "작년 1월 영수증은 파기해라!" 하면 영수증을 한 장씩 찢는 게 아니라 작년 1월 바인더를 통째로 쓰레기통에 던져버리면(DROP PARTITION) 됩니다.