Oracle Partitioning은 대용량 테이블과 인덱스를 여러 개의 파티션으로 나누어 관리하는 기술입니다. 이를 통해 쿼리 성능 향상, 병렬 처리 최적화, 관리 용이성 개선 등의 장점을 제공합니다.
1. 파티션 개념
- 데이터를 논리적으로 여러 개의 파티션으로 나누어 저장하는 방식
- 테이블과 인덱스를 물리적으로 여러 개의 세그먼트로 관리
- 대량 데이터 처리가 용이하고, 특정 파티션만 액세스할 수 있어 성능 최적화 가능
2. 파티션 종류
Oracle에서는 여러 가지 파티션 방식을 제공하며, 데이터의 분할 기준에 따라 나뉩니다.
(1) RANGE PARTITION (범위 파티션)
- 특정 범위(Range) 기준으로 데이터를 나누는 방식
- 주로 날짜 또는 숫자 값을 기준으로 파티셔닝
📌 예제: 주문일(order_date
)을 기준으로 분할
CREATE TABLE orders (
order_id NUMBER,
customer_id NUMBER,
order_date DATE,
amount NUMBER
)
PARTITION BY RANGE (order_date) (
PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')),
PARTITION p_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD'))
);
p_2023
: 2023년까지의 주문 데이터 저장p_2024
: 2024년 주문 데이터 저장
✔ 장점:
- 날짜 기반 분석에 유용
- 특정 기간의 데이터만 백업/삭제 가능
(2) LIST PARTITION (리스트 파티션)
- 특정 목록(List) 기준으로 데이터를 나누는 방식
- 국가, 지역, 제품 카테고리와 같은 값에 적합
📌 예제: 국가(region
)를 기준으로 파티션 분할
CREATE TABLE customers (
customer_id NUMBER,
customer_name VARCHAR2(100),
region VARCHAR2(50)
)
PARTITION BY LIST (region) (
PARTITION p_korea VALUES ('KOREA'),
PARTITION p_usa VALUES ('USA'),
PARTITION p_others VALUES (DEFAULT)
);
p_korea
: 한국 데이터 저장p_usa
: 미국 데이터 저장p_others
: 그 외 국가 데이터 저장
✔ 장점:
- 특정 값 기반 데이터 조회 성능 향상
- 특정 그룹별 관리 용이
(3) HASH PARTITION (해시 파티션)
- 균등한 부하 분산이 필요한 경우 사용
- 랜덤한 값(예: 고객 ID, 주문 ID) 등을 기준으로 분할
- 파티션의 크기가 균등하게 유지됨
📌 예제: 고객 ID를 기준으로 해시 파티션 적용
CREATE TABLE transactions (
transaction_id NUMBER,
customer_id NUMBER,
amount NUMBER
)
PARTITION BY HASH (customer_id)
PARTITIONS 4;
- 고객 ID를 기준으로 4개의 파티션에 랜덤하게 분배됨
✔ 장점:
- 균등한 분산을 보장
- 특정 데이터에 대한 I/O 부하 분산 효과
(4) COMPOSITE PARTITION (복합 파티션)
- 두 개 이상의 파티션 방식을 결합하여 사용
- RANGE + HASH, RANGE + LIST 등 다양한 조합 가능
📌 예제: 연도별(RANGE) + 고객 ID(HASH) 복합 파티션 적용
CREATE TABLE sales (
sale_id NUMBER,
sale_date DATE,
customer_id NUMBER,
amount NUMBER
)
PARTITION BY RANGE (sale_date)
SUBPARTITION BY HASH (customer_id)
SUBPARTITIONS 4 (
PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')),
PARTITION p_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD'))
);
연도별로 1차 분할 (RANGE
)
- 각 연도 파티션 내부를 고객 ID 기준으로 다시 해시 분할 (
HASH
)
✔ 장점:
- 대량 데이터 관리 최적화
- 복합적인 조회 조건에도 성능 향상 가능
3. 파티션 프루닝 (Partition Pruning)
Partition Pruning(파티션 절단)은 불필요한 파티션을 자동으로 제외하여 성능을 최적화하는 기법입니다.
쿼리에서 특정 조건을 포함하면 해당 파티션만 접근하여 I/O 부하를 줄일 수 있음.
(1) RANGE PARTITION에서 프루닝 예제
SELECT * FROM orders WHERE order_date BETWEEN TO_DATE('2024-01-01', 'YYYY-MM-DD')
AND TO_DATE('2024-12-31', 'YYYY-MM-DD');
✔ 결과:
p_2024
파티션만 읽고, 다른 파티션(p_2023 등)은 읽지 않음 → I/O 최소화
(2) LIST PARTITION에서 프루닝 예제
SELECT * FROM customers WHERE region = 'KOREA';
✔ 결과:
p_korea
파티션만 접근 → 성능 향상
(3) HASH PARTITION에서 프루닝 예제
SELECT * FROM transactions WHERE customer_id = 12345;
✔ 결과:
customer_id
해시 값에 따라 특정 파티션에만 접근 → 랜덤 분산에도 불필요한 I/O 최소화
4. 파티션 관리
(1) 새로운 파티션 추가
ALTER TABLE orders ADD PARTITION p_2025 VALUES LESS THAN (TO_DATE('2026-01-01', 'YYYY-MM-DD'));
- 새로운 연도 데이터 저장을 위한 파티션 추가
(2) 기존 파티션 삭제
ALTER TABLE orders DROP PARTITION p_2023;
- 오래된 데이터 삭제 후 디스크 공간 회수 가능
(3) 파티션 병합 (MERGE)
ALTER TABLE orders MERGE PARTITIONS p_2023, p_2024 INTO PARTITION p_merged;
- 기존 두 개의 파티션을 하나로 병합
(4) 파티션 데이터만 삭제
ALTER TABLE orders TRUNCATE PARTITION p_2023;
- 특정 파티션의 데이터만 초기화 (테이블 전체 삭제 없이 가능)
5. 결론
✅ Oracle Partitioning은 대량 데이터의 효율적인 관리와 성능 최적화에 필수적인 기술
✅ 프루닝을 통해 쿼리 속도를 대폭 향상 가능
✅ RANGE, LIST, HASH, COMPOSITE 등의 파티션 기법을 적절히 활용하여 성능 개선 가능
✅ 불필요한 데이터 관리(삭제, 이동)도 쉽게 수행 가능
🎯 대용량 데이터 처리 및 분석 업무에서 반드시 고려해야 할 핵심 기술! 🚀