🌳 15편. PARTITION 테이블과 대용량 테이블 설계 전략
수억 건 이상의 데이터를 처리하는 시스템에서는 단일 테이블로만 데이터를 관리하면 성능 저하, 인덱스 병목, 관리 부담이 발생할 수 있습니다.
Oracle의 PARTITION
기능을 활용하면 테이블을 논리적으로 나누어 성능과 관리성을 향상시킬 수 있습니다.
이번 글에서는 파티션 테이블의 구조, 유형, 인덱스 설계, 실무 적용 전략을 정리합니다.
🧱 1. 파티션이란?
파티션 테이블은 하나의 테이블을 여러 물리적 세그먼트로 분할하여 관리하는 구조입니다.
사용자는 단일 테이블처럼 조회하지만, Oracle은 내부적으로 분할된 파티션별로 처리하므로 속도와 효율이 크게 향상됩니다.
🧩 2. 파티션 유형
유형 | 설명 | 예시 |
---|---|---|
Range Partition | 범위 기준으로 파티션 분할 | 날짜, 숫자 범위 |
List Partition | 정해진 값 목록으로 분할 | 지역 코드, 상태 값 |
Hash Partition | 해시 값으로 균등 분산 | ID, 고유키 등 |
Composite (복합) | 2가지 방식 혼합 (예: Range + Hash) | 월별 파티션 + 해시 서브파티션 |
📦 3. Range 파티션 예제
CREATE TABLE SALES_DATA (
ID NUMBER,
SALE_DATE DATE,
AMOUNT NUMBER
)
PARTITION BY RANGE (SALE_DATE) (
PARTITION P2023Q1 VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD')),
PARTITION P2023Q2 VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD')),
PARTITION P_MAX VALUES LESS THAN (MAXVALUE)
);
📥 4. 파티션 테이블 조회 시 최적화
- 파티션 키를 WHERE 조건에 명시하면 파티션 프루닝 적용
- 불필요한 파티션은 스캔하지 않음 → 성능 향상
-- 특정 분기 데이터만 조회
SELECT * FROM SALES_DATA
WHERE SALE_DATE BETWEEN TO_DATE('2023-01-01') AND TO_DATE('2023-03-31');
🧭 5. 파티션 인덱스 전략
- 로컬 인덱스 (Local Index): 파티션별로 나뉜 인덱스. 병렬 처리에 유리
- 글로벌 인덱스 (Global Index): 전체 데이터 대상으로 하나의 인덱스
-- 로컬 인덱스 생성
CREATE INDEX IDX_SALES_DATE ON SALES_DATA(SALE_DATE)
LOCAL;
TIP: 로컬 인덱스는 파티션별 관리가 용이하며 유지보수에 유리
🔄 6. 파티션 유지보수
-- 파티션 추가
ALTER TABLE SALES_DATA
ADD PARTITION P2024Q1 VALUES LESS THAN (TO_DATE('2024-04-01', 'YYYY-MM-DD'));
-- 파티션 분할
ALTER TABLE SALES_DATA
SPLIT PARTITION P_MAX AT (TO_DATE('2024-01-01')) INTO (
PARTITION P2023Q4,
PARTITION P_MAX
);
-- 파티션 삭제
ALTER TABLE SALES_DATA
DROP PARTITION P2022Q1;
🧠 실무 설계 전략
- 기간별 데이터는 Range 파티션이 가장 효율적 (월별, 분기별 등)
- 분산 부하가 필요하면 Hash 파티션 고려
- 조회 조건에 파티션 키 사용을 유도하는 구조 설계
- ETL/배치 시스템에서는 파티션 단위로 로딩/삭제 가능
📝 마무리
이번 글에서는 Oracle의 파티션 테이블 구조와 대용량 설계 전략을 살펴봤습니다.
다음 글에서는 트랜잭션과 격리 수준 완전 정리를 통해 실무에서의 정확성과 동시성 제어 전략을 다루겠습니다.
'database > oracle' 카테고리의 다른 글
🌳 17편. Lock 이해와 Deadlock 방지 전략 (0) | 2025.05.07 |
---|---|
🌳 16편. 트랜잭션과 격리 수준 완전 정리 (0) | 2025.05.07 |
🌳 14편. 실무 고급 SQL 패턴 모음 (0) | 2025.05.06 |
🌳 13편. 오라클 커서(Cursor)와 BULK COLLECT (1) | 2025.05.06 |
🌳 12편. 동적 SQL과 EXECUTE IMMEDIATE (0) | 2025.05.06 |
댓글