본문 바로가기

카테고리 없음

[Oracle] Oracle 파티션 테이블(Partition Tables) 완벽 가이드

반응형

파티션 테이블은 대용량 데이터를 효율적으로 관리하기 위한 Oracle의 핵심 기능입니다. 이 가이드에서는 파티션 테이블의 개념부터 실제 활용 방법까지 상세히 다루겠습니다.

1. 파티션 테이블 개요

1.1 주요 특징

  • 대용량 테이블을 작은 단위로 분할 관리
  • 데이터 조회/관리 성능 향상
  • 가용성과 관리 용이성 증가
  • 독립적인 백업/복구 가능
  • 파티션 단위의 독립적인 유지보수

1.2 파티션 유형

  1. Range Partition
    • 날짜, 숫자 등 연속된 값 기준
  2. List Partition
    • 불연속적인 값들의 목록 기준
  3. Hash Partition
    • 해시 알고리즘 기반 균등 분할
  4. 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. 파티션 테이블 관리 팁

  1. 파티션 키 선택
    • 조회 패턴 분석
    • 데이터 분포 고려
    • 파티션 프루닝 효과 최대화
  2. 파티션 크기
    • 균등한 크기 유지
    • 관리 용이성 고려
    • 성능과 관리의 균형
  3. 백업 전략
    • 파티션 단위 백업
    • 점진적 백업 구현
    • 복구 시간 최소화

8. 성능 고려사항

  1. 파티션 개수
    • 너무 많은 파티션은 관리 복잡도 증가
    • 너무 적은 파티션은 성능 이점 감소
    • 적절한 균형점 찾기
  2. 인덱스 전략
    • 로컬 vs 글로벌 인덱스 선택
    • 파티션 키 포함 여부
    • 유지보수 영향도 고려
  3. 병렬 처리

-- 병렬 처리를 활용한 대량 데이터 처리

ALTER SESSION ENABLE PARALLEL DML;

INSERT /+ APPEND PARALLEL(s,4) */
INTO sales_range
SELECT /+ PARALLEL(4) */ *
FROM source_table

파티션 테이블은 대용량 데이터베이스 관리의 핵심 기능입니다. 적절한 파티션 전략 수립과 구현을 통해 성능, 가용성, 관리 효율성을 크게 향상시킬 수 있습니다. 다만, 업무 특성과 데이터 특성을 충분히 고려한 설계가 필요하며, 지속적인 모니터링과 관리가 필요합니다.

반응형