본문 바로가기
database/oracle

🌳 15편. PARTITION 테이블과 대용량 테이블 설계 전략

by 죄니안죄니 2025. 5. 6.

🌳 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의 파티션 테이블 구조와 대용량 설계 전략을 살펴봤습니다.
다음 글에서는 트랜잭션과 격리 수준 완전 정리를 통해 실무에서의 정확성과 동시성 제어 전략을 다루겠습니다.

댓글