반응형
파티션 테이블은 대용량 데이터를 효율적으로 관리하기 위한 Oracle의 핵심 기능입니다. 이 가이드에서는 파티션 테이블의 개념부터 실제 활용 방법까지 상세히 다루겠습니다.
1. 파티션 테이블 개요
1.1 주요 특징
- 대용량 테이블을 작은 단위로 분할 관리
- 데이터 조회/관리 성능 향상
- 가용성과 관리 용이성 증가
- 독립적인 백업/복구 가능
- 파티션 단위의 독립적인 유지보수
1.2 파티션 유형
- Range Partition
- 날짜, 숫자 등 연속된 값 기준
- List Partition
- 불연속적인 값들의 목록 기준
- Hash Partition
- 해시 알고리즘 기반 균등 분할
- Composite Partition
- 두 가지 이상의 파티션 방식 조합
2. 파티션 테이블 생성 예제
2.1 Range Partition
-- 연도별 주문 데이터 파티션
CREATE TABLE sales_range (
sale_id NUMBER,
sale_date DATE,
customer_id NUMBER,
amount NUMBER
)
PARTITION BY RANGE (sale_date) (
PARTITION sales_2022 VALUES LESS THAN (DATE '2023-01-01')
TABLESPACE ts_sales_2022,
PARTITION sales_2023 VALUES LESS THAN (DATE '2024-01-01')
TABLESPACE ts_sales_2023,
PARTITION sales_2024 VALUES LESS THAN (DATE '2025-01-01')
TABLESPACE ts_sales_2024,
PARTITION sales_future VALUES LESS THAN (MAXVALUE)
TABLESPACE ts_sales_future
);
2.2 List Partition
-- 지역별 고객 데이터 파티션
CREATE TABLE customers_list (
customer_id NUMBER,
customer_name VARCHAR2(100),
region VARCHAR2(20),
credit_limit NUMBER
)
PARTITION BY LIST (region) (
PARTITION customers_seoul VALUES ('SEOUL'),
PARTITION customers_busan VALUES ('BUSAN'),
PARTITION customers_incheon VALUES ('INCHEON'),
PARTITION customers_others VALUES (DEFAULT)
);
2.3 Hash Partition
-- 고객 ID 기반 해시 파티션
CREATE TABLE orders_hash (
order_id NUMBER,
customer_id NUMBER,
order_date DATE,
amount NUMBER
)
PARTITION BY HASH (customer_id)
PARTITIONS 4
STORE IN (ts_orders1, ts_orders2, ts_orders3, ts_orders4);
2.4 Composite Partition
-- 연도별-지역별 복합 파티션
CREATE TABLE sales_composite (
sale_id NUMBER,
sale_date DATE,
region VARCHAR2(20),
amount NUMBER
)
PARTITION BY RANGE (sale_date)
SUBPARTITION BY LIST (region) (
PARTITION sales_2023 VALUES LESS THAN (DATE '2024-01-01') (
SUBPARTITION sales_2023_seoul VALUES ('SEOUL'),
SUBPARTITION sales_2023_busan VALUES ('BUSAN'),
SUBPARTITION sales_2023_others VALUES (DEFAULT)
),
PARTITION sales_2024 VALUES LESS THAN (DATE '2025-01-01') (
SUBPARTITION sales_2024_seoul VALUES ('SEOUL'),
SUBPARTITION sales_2024_busan VALUES ('BUSAN'),
SUBPARTITION sales_2024_others VALUES (DEFAULT)
)
);
3. 파티션 관리
3.1 파티션 추가
-- Range 파티션 추가
ALTER TABLE sales_range
ADD PARTITION sales_2025
VALUES LESS THAN (DATE '2026-01-01')
TABLESPACE ts_sales_2025;
-- List 파티션 추가
ALTER TABLE customers_list
ADD PARTITION customers_daegu
VALUES ('DAEGU');
3.2 파티션 분할
-- 기존 파티션을 두 개로 분할
ALTER TABLE sales_range
SPLIT PARTITION sales_2024 AT (DATE '2024-07-01')
INTO (
PARTITION sales_2024_h1,
PARTITION sales_2024_h2
);
3.3 파티션 병합
-- 두 파티션을 하나로 병합
ALTER TABLE sales_range
MERGE PARTITIONS sales_2024_h1, sales_2024_h2
INTO PARTITION sales_2024;
3.4 파티션 삭제
-- 파티션 삭제
ALTER TABLE sales_range
DROP PARTITION sales_2022;
4. 파티션 관련 성능 최적화
4.1 파티션 프루닝
-- 파티션 프루닝을 활용한 조회
SELECT *
FROM sales_range
WHERE sale_date BETWEEN DATE '2023-01-01' AND DATE '2023-12-31';
-- 실행계획 확인
EXPLAIN PLAN FOR
SELECT *
FROM sales_range
WHERE sale_date BETWEEN DATE '2023-01-01' AND DATE '2023-12-31';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
4.2 파티션 인덱스
-- 로컬 파티션 인덱스 생성
CREATE INDEX idx_sales_date
ON sales_range(sale_date) LOCAL;
-- 글로벌 파티션 인덱스 생성
CREATE INDEX idx_sales_customer
ON sales_range(customer_id) GLOBAL
PARTITION BY HASH (customer_id)
PARTITIONS 4;
5. 실제 활용 사례
5.1 이력 데이터 관리
-- 거래 이력 테이블
CREATE TABLE transaction_history (
trans_id NUMBER,
trans_date DATE,
account_id NUMBER,
amount NUMBER,
trans_type VARCHAR2(10)
)
PARTITION BY RANGE (trans_date)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) (
PARTITION trans_first
VALUES LESS THAN (DATE '2023-01-01')
);
5.2 데이터 아카이빙
-- 오래된 데이터 아카이브
CREATE TABLE sales_archive
TABLESPACE arch_ts
AS
SELECT * FROM sales_range
WHERE sale_date < DATE '2023-01-01';
ALTER TABLE sales_range
DROP PARTITION sales_2022;
6. 파티션 관련 모니터링
6.1 파티션 정보 조회
-- 파티션 정보 조회
SELECT table_name, partition_name, high_value
FROM ALL_TAB_PARTITIONS
WHERE table_name = 'SALES_RANGE';
-- 파티션별 통계 정보
SELECT partition_name, num_rows, blocks
FROM ALL_TAB_PARTITIONS
WHERE table_name = 'SALES_RANGE';
6.2 파티션 사용량 모니터링
SELECT p.partition_name,
p.tablespace_name,
p.num_rows,
p.blocks * t.block_size / 1024 / 1024 as size_mb
FROM all_tab_partitions p,
dba_tablespaces t
WHERE p.table_name = 'SALES_RANGE'
AND p.tablespace_name = t.tablespace_name;
7. 파티션 테이블 관리 팁
- 파티션 키 선택
- 조회 패턴 분석
- 데이터 분포 고려
- 파티션 프루닝 효과 최대화
- 파티션 크기
- 균등한 크기 유지
- 관리 용이성 고려
- 성능과 관리의 균형
- 백업 전략
- 파티션 단위 백업
- 점진적 백업 구현
- 복구 시간 최소화
8. 성능 고려사항
- 파티션 개수
- 너무 많은 파티션은 관리 복잡도 증가
- 너무 적은 파티션은 성능 이점 감소
- 적절한 균형점 찾기
- 인덱스 전략
- 로컬 vs 글로벌 인덱스 선택
- 파티션 키 포함 여부
- 유지보수 영향도 고려
- 병렬 처리
-- 병렬 처리를 활용한 대량 데이터 처리
ALTER SESSION ENABLE PARALLEL DML;
INSERT /+ APPEND PARALLEL(s,4) */
INTO sales_range
SELECT /+ PARALLEL(4) */ *
FROM source_table
파티션 테이블은 대용량 데이터베이스 관리의 핵심 기능입니다. 적절한 파티션 전략 수립과 구현을 통해 성능, 가용성, 관리 효율성을 크게 향상시킬 수 있습니다. 다만, 업무 특성과 데이터 특성을 충분히 고려한 설계가 필요하며, 지속적인 모니터링과 관리가 필요합니다.
반응형