본문 바로가기

[Oracle] 파티셔닝(Partitioning)을 활용한 대용량 데이터 관리

by 애덤더미 2024. 10. 24.
반응형

Oracle Partitioning은 대용량 테이블의 성능을 최적화하는 데 강력한 도구입니다.

이번 글에서는 Partitioning의 주요 개념을 짧게 설명하고, 다양한 유형의 Partitioning을 적용하는 SQL 예시를 중심으로 소개하겠습니다.

 

1. Range Partitioning

Range Partitioning은 날짜나 숫자와 같은 연속된 값에 따라 데이터를 분할하는 방식입니다. 예를 들어, 날짜를 기준으로 분할하여 테이블을 관리할 수 있습니다.

-- 연도별로 파티션을 나누는 예시
CREATE TABLE sales_data (
    sale_id      NUMBER,
    sale_date    DATE,
    amount       NUMBER
)
PARTITION BY RANGE (sale_date) (
    PARTITION p2022 VALUES LESS THAN (TO_DATE('01-JAN-2023', 'DD-MON-YYYY')),
    PARTITION p2023 VALUES LESS THAN (TO_DATE('01-JAN-2024', 'DD-MON-YYYY')),
    PARTITION p2024 VALUES LESS THAN (TO_DATE('01-JAN-2025', 'DD-MON-YYYY'))
);

위 예시에서는 sale_date를 기준으로 연도별로 파티션을 나누었습니다. 해당 연도의 데이터를 조회할 때 전체 테이블을 검색할 필요 없이 해당 연도의 파티션만 검색하게 되어 성능이 향상됩니다.

 

2. List Partitioning

List Partitioning은 특정 값의 목록에 따라 데이터를 분할하는 방식입니다. 주로 지역이나 카테고리별로 데이터를 나눌 때 유용합니다.

-- 지역별로 파티션을 나누는 예시
CREATE TABLE customer_data (
    customer_id   NUMBER,
    customer_name VARCHAR2(100),
    region        VARCHAR2(50)
)
PARTITION BY LIST (region) (
    PARTITION p_north VALUES ('NORTH'),
    PARTITION p_south VALUES ('SOUTH'),
    PARTITION p_east  VALUES ('EAST'),
    PARTITION p_west  VALUES ('WEST')
);

이 예제에서는 region을 기준으로 데이터를 네 개의 파티션으로 분할했습니다. 각 지역별 데이터를 효율적으로 조회할 수 있도록 설정했습니다.

 

3. Hash Partitioning

Hash Partitioning은 데이터가 불균등하게 분포되어 있을 때 유용합니다. 해시 함수를 사용하여 데이터를 균등하게 분산시킵니다.

-- 해시 파티셔닝을 사용하는 예시
CREATE TABLE orders (
    order_id     NUMBER,
    customer_id  NUMBER,
    order_date   DATE
)
PARTITION BY HASH (customer_id)
PARTITIONS 4;

이 예시는 customer_id를 기준으로 데이터를 4개의 파티션에 무작위로 분배합니다. 해시 파티션은 데이터의 균등한 분포를 보장하기 때문에, 특정 키에 데이터가 몰리지 않도록 할 수 있습니다.

 

4. Composite Partitioning (Range-Hash)

Composite Partitioning은 두 가지 파티셔닝 방식을 결합하여 더 세분화된 데이터 관리를 제공합니다. Range와 Hash를 결합하면 날짜를 기준으로 나눈 후, 각 날짜별 데이터를 해시로 분산할 수 있습니다.

-- Range와 Hash 파티션을 결합한 예시
CREATE TABLE transaction_data (
    transaction_id  NUMBER,
    transaction_date DATE,
    amount          NUMBER
)
PARTITION BY RANGE (transaction_date)
SUBPARTITION BY HASH (transaction_id)
SUBPARTITIONS 4 (
    PARTITION p2022 VALUES LESS THAN (TO_DATE('01-JAN-2023', 'DD-MON-YYYY')),
    PARTITION p2023 VALUES LESS THAN (TO_DATE('01-JAN-2024', 'DD-MON-YYYY'))
);

이 예제에서는 transaction_date를 기준으로 먼저 Range Partitioning을 하고, 각 연도의 데이터를 transaction_id로 다시 Hash Partitioning을 했습니다. 이렇게 하면 특정 연도에 대한 데이터를 조회할 때 추가로 해시 파티션을 사용하여 쿼리 성능을 더욱 최적화할 수 있습니다.

 

5. Partitioned Index 생성

Partitioning을 적용한 테이블에 인덱스를 생성하는 것도 매우 중요합니다. 파티션 인덱스를 사용하면 쿼리 성능을 극대화할 수 있습니다.

-- 파티션 테이블에 대한 인덱스 생성 예시
CREATE INDEX idx_sales_data ON sales_data (sale_date, amount)
LOCAL;  -- 각 파티션마다 인덱스를 생성

LOCAL 옵션을 사용하면 각 파티션에 개별적인 인덱스를 생성하게 됩니다. 이를 통해 인덱스도 파티션의 이점을 누릴 수 있습니다.

반응형