파티셔닝 추가 내용.
1. Local vs. Global Partitioned Indexes (로컬 vs. 글로벌 파티션 인덱스)
Oracle Partitioning에서는 인덱스를 로컬 인덱스와 글로벌 인덱스로 나눌 수 있습니다.
로컬 인덱스: 파티션마다 별도의 인덱스를 가지고 있습니다. 특정 파티션에 접근할 때 해당 인덱스만 사용하므로 관리가 용이하고 성능이 좋습니다.
CREATE INDEX sales_idx ON sales(sale_date) LOCAL;
글로벌 인덱스: 모든 파티션을 통합하여 하나의 인덱스로 관리합니다. 파티셔닝 키 이외의 열을 자주 검색할 때 유용합니다.
CREATE INDEX global_sales_idx ON sales(amount) GLOBAL;
2. Interval Partitioning (간격 파티셔닝)
기존의 Range Partitioning을 개선한 기법으로, 새로운 값이 추가되면 자동으로 새로운 파티션을 생성합니다. 이 기능은 주기적인 데이터 추가가 있는 환경에서 매우 유용합니다.
CREATE TABLE sales (
sale_id NUMBER,
sale_date DATE,
amount NUMBER
)
PARTITION BY RANGE (sale_date)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH')) (
PARTITION p1 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD'))
);
위 예제에서 새로운 월의 데이터가 추가되면 자동으로 새로운 파티션이 생성됩니다.
3. Reference Partitioning (참조 파티셔닝)
외래 키 관계를 기반으로 두 테이블을 파티셔닝할 때 사용됩니다. 부모 테이블의 파티셔닝 구조를 자식 테이블이 따릅니다.
CREATE TABLE orders (
order_id NUMBER,
customer_id NUMBER,
order_date DATE
)
PARTITION BY RANGE (order_date);
CREATE TABLE order_items (
order_id NUMBER,
product_id NUMBER,
quantity NUMBER,
CONSTRAINT fk_order FOREIGN KEY (order_id) REFERENCES orders(order_id)
)
PARTITION BY REFERENCE (fk_order);
위 예제에서 order_items
테이블은 orders
테이블의 파티셔닝 구조를 그대로 따릅니다.
4. Subpartitioning (서브파티셔닝)
복합적인 파티셔닝을 적용하여, 하나의 파티션 내에서 추가로 파티셔닝을 수행하는 방식입니다. 예를 들어, 먼저 범위로 나누고, 그 후에 해시로 다시 분할할 수 있습니다.
CREATE TABLE transactions (
trans_id NUMBER,
trans_date DATE,
region VARCHAR2(50)
)
PARTITION BY RANGE (trans_date)
SUBPARTITION BY HASH (region) SUBPARTITIONS 4 (
PARTITION p1 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')),
PARTITION p2 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))
);
이 방식은 데이터의 균등한 분포를 유지하면서도 범위 기준의 효율적인 조회가 필요할 때 사용됩니다.
5. List Partitioning (리스트 파티셔닝) 심화
List Partitioning은 Oracle Partitioning에서 데이터를 명시적으로 정의된 값 목록에 따라 파티션으로 나누는 방식입니다. 주로 범주형 데이터 또는 그룹으로 나눌 수 있는 데이터에 사용됩니다. 예를 들어, 지역, 제품군, 고객 유형 등의 데이터를 기준으로 파티셔닝할 때 적합합니다.
List Partitioning의 특징
- 명확한 값 기반 분할: 데이터 값이 명확하게 구분되는 경우, 리스트 파티셔닝을 통해 각 값 그룹을 개별 파티션으로 관리할 수 있습니다.
- 유연성: 새로운 값이 추가될 때 파티션을 동적으로 확장하거나 새로운 파티션을 추가할 수 있습니다.
- 쿼리 최적화: 특정 값만 검색할 때 관련 파티션에만 접근하므로 성능이 향상됩니다.
List Partitioning의 예시
다음은 Oracle에서 List Partitioning을 사용하는 예제입니다. 예를 들어, 고객 데이터를 지역별로 분할한다고 가정해보겠습니다:
CREATE TABLE customers (
customer_id NUMBER,
customer_name VARCHAR2(100),
region VARCHAR2(50)
)
PARTITION BY LIST (region) (
PARTITION east VALUES ('East', 'Northeast', 'Southeast'),
PARTITION west VALUES ('West', 'Northwest', 'Southwest'),
PARTITION central VALUES ('Central', 'Midwest'),
PARTITION others VALUES (DEFAULT)
);
위 예제에서, region
값을 기준으로 고객 데이터를 여러 파티션으로 분할합니다. 각 파티션은 하나 이상의 값을 가질 수 있으며, 예를 들어 east
파티션에는 'East', 'Northeast', 'Southeast'가 포함됩니다.
List Partitioning의 추가 기능
DEFAULT 파티션: 지정된 값 외에 다른 모든 값을 처리하는 "기본" 파티션을 정의할 수 있습니다. 이는 예상하지 못한 값이 추가되었을 때 유용합니다.
- 예제에서
others
파티션은 명시된 값 목록에 없는 모든 데이터를 수용합니다.
- 예제에서
Multi-level List Partitioning (다단계 리스트 파티셔닝): List Partitioning은 다른 파티셔닝 전략과 결합하여 더 복잡한 분할 구조를 만들 수 있습니다. 예를 들어, 리스트 파티셔닝 후, 각 파티션을 다시 해시나 범위로 서브파티셔닝할 수 있습니다.
CREATE TABLE orders ( order_id NUMBER, order_date DATE, region VARCHAR2(50) ) PARTITION BY LIST (region) SUBPARTITION BY RANGE (order_date) ( PARTITION east VALUES ('East', 'Northeast', 'Southeast') ( SUBPARTITION p_east_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')), SUBPARTITION p_east_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')) ), PARTITION west VALUES ('West', 'Northwest', 'Southwest') ( SUBPARTITION p_west_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')), SUBPARTITION p_west_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')) ) );
이 구조는 지역을 기준으로 리스트 파티셔닝한 다음, 각 지역 데이터를 다시 연도별로 범위 서브파티셔닝합니다. 이를 통해 데이터 관리와 쿼리 성능을 극대화할 수 있습니다.