홈 › 대용량·배치 › 05 / 8

파티션: 범위·목록·해시 분할, 파티션 프루닝, 파티션 단위 관리

섹션 6진행 0 / 8

2. 핵심 원리

2.1 파티션이란

파티션은 한 논리 표를 키 컬럼의 값에 따라 여러 물리 조각으로 나눈 것입니다. 표 이름은 하나이고 INSERT 와 SELECT 는 그대로 씁니다. DB 가 행의 키 값을 보고 알맞은 조각에 넣고 꺼냅니다.

나누는 기준 컬럼을 파티션 키라고 합니다. 어떤 키로 어떻게 나누느냐가 파티션 설계의 전부입니다.

2.2 분할 방식

방식 나누는 기준 잘 맞는 키
범위(RANGE) 값의 구간 주문일, 등록일
목록(LIST) 값의 목록 지역, 상태 코드
해시(HASH) 해시 함수 결과 고르게 흩고 싶은 id
조합(복합) 범위 안에서 다시 목록·해시 월별로 나눈 뒤 지점별로

범위는 날짜에 가장 흔합니다. 월별 조각을 두면 지난달 조회는 한 조각만 읽고, 오래된 달은 조각째 지웁니다. 목록은 값이 몇 개뿐이고 조회가 값 단위로 이뤄질 때 씁니다. 해시는 조각 크기를 고르게 맞추고 싶을 때 씁니다.

2.3 파티션 프루닝

파티션 프루닝은 WHERE 조건으로 읽을 필요가 없는 조각을 건너뛰는 것입니다. 3월 조건이면 3월 조각만 읽고 나머지는 열지 않습니다. 이것이 파티션의 조회 이득입니다.

프루닝은 조건이 파티션 키에 직접 걸릴 때만 됩니다. 키에 함수를 씌우면 프루닝이 안 될 수 있습니다.

sql
-- 프루닝 됨: 키 컬럼에 직접 범위 조건
WHERE ord_date >= DATE '2025-03-01' AND ord_date < DATE '2025-04-01'

-- 프루닝 안 될 수 있음: 키 컬럼에 함수
WHERE EXTRACT(MONTH FROM ord_date) = 3
핵심

파티션의 이득은 조건이 파티션 키에 걸릴 때만 옵니다. 키가 조건에 없는 조회는 모든 조각을 읽어, 조각 관리 비용만큼 오히려 느려질 수 있습니다.

2.4 DB별 파티션 지원

항목 Oracle · Tibero MySQL MSSQL
방식 RANGE, LIST, HASH, 복합 RANGE, LIST, HASH, KEY 범위(파티션 함수)
자동 생성 11g 부터 INTERVAL 없음, 직접 추가 없음, 직접 추가
확인 실행 계획의 Pstart·Pstop EXPLAIN 의 partitions 열 실행 계획의 파티션 정보
조각 삭제 DROP·TRUNCATE PARTITION DROP·TRUNCATE PARTITION SWITCH, TRUNCATE ... PARTITIONS

Oracle 파티션은 Enterprise Edition 의 유료 옵션(Partitioning)입니다. Tibero 도 파티션을 지원합니다. MSSQL 은 2016 SP1 부터 Standard 에서도 쓸 수 있고 그 이전은 Enterprise 전용이었습니다.

2.5 DB별 제약과 특징

  • Oracle: 로컬 인덱스는 파티션마다 따로 만들어지고, 글로벌 인덱스는 표 전체에 하나입니다.
  • Oracle: DROP·TRUNCATE PARTITION 은 글로벌 인덱스를 UNUSABLE 로 만들 수 있어 UPDATE GLOBAL INDEXES 절을 붙입니다.
  • MySQL: 모든 유니크 키(PK 포함)에 파티션 키가 들어가야 합니다.
  • MySQL: 파티션된 InnoDB 표는 외래 키를 쓸 수 없습니다.
  • MSSQL: 파티션 함수, 파티션 구성표, 표 생성의 세 단계로 만듭니다.

MySQL 의 유니크 키 제약은 설계에 크게 영향을 줍니다. id 가 PK 인 표를 주문일로 나누려면 PK 를 (id, ord_date) 로 바꿔야 합니다.