데이터베이스 파티셔닝(Database Partitioning)은 대규모의 데이터베이스를 관리하기 용이하도록 설계된 기술입니다. 이 방식은 데이터베이스 또는 테이블을 더 작고, 관리하기 편리한 단위로 분할하는 것을 말합니다. 파티셔닝은 데이터를 물리적으로 여러 부분으로 나누되, 애플리케이션 입장에서는 여전히 하나의 데이터베이스나 테이블로 인식되도록 합니다. 이를 통해 성능 향상, 관리의 용이성, 고가용성을 달성할 수 있습니다.
파티셔닝의 주요 유형은 다음과 같습니다. 예제 쿼리는 오라클을 기준으로 작성되었습니다.
레인지 파티셔닝은 특정 열의 값 범위를 기준으로 데이터를 분할합니다. 예를 들어, orders 테이블에서 주문 날짜(order_date)를 기준으로 데이터를 연도별로 분할할 수 있습니다.
CREATE TABLE orders (
order_id NUMBER,
customer_id NUMBER,
order_date DATE,
order_total NUMBER
)
PARTITION BY RANGE (order_date) (
PARTITION p2020 VALUES LESS THAN (TO_DATE('2021-01-01', 'YYYY-MM-DD')),
PARTITION p2021 VALUES LESS THAN (TO_DATE('2022-01-01', 'YYYY-MM-DD')),
PARTITION p2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD'))
);
인터벌 파티셔닝(Interval Partitioning)은 오라클 데이터베이스에서 제공하는 고급 파티셔닝 기능 중 하나입니다. 이 기능은 레인지(range) 파티셔닝의 자동화된 형태로 볼 수 있으며, 사전에 정의된 범위(interval)에 따라 자동으로 새로운 파티션을 생성합니다. 이로써 관리자가 수동으로 파티션을 추가하지 않아도, 데이터가 해당 범위를 초과할 때마다 새로운 파티션을 자동으로 생성하여 데이터를 저장할 수 있습니다.
정의 단계에서 시작 파티션을 설정: 사용자는 테이블을 생성할 때 시작 파티션을 정의하고, 인터벌을 지정합니다. 이 인터벌은 테이블에 추가되는 데이터에 따라 자동으로 새로운 파티션이 생성되는 기준이 됩니다.
자동 파티션 생성: 데이터가 삽입될 때, 해당 데이터가 속해야 할 파티션의 범위가 이미 존재하지 않는 경우, 오라클은 자동으로 새로운 파티션을 생성합니다. 이 파티션은 사전에 정의된 인터벌에 따라 범위가 결정됩니다.
예를 들어, 주문 날짜(order_date)를 기준으로 하는 orders 테이블에서, 매월 자동으로 새로운 파티션이 생성되도록 설정할 수 있습니다.
CREATE TABLE orders (
order_id NUMBER,
customer_id NUMBER,
order_date DATE,
amount NUMBER
)
PARTITION BY RANGE (order_date)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION p_initial VALUES LESS THAN (TO_DATE('2020-01-01', 'YYYY-MM-DD'))
);
이 예제에서는 2020년 1월 1일 이전의 모든 데이터를 위한 초기 파티션 p_initial을 생성합니다. 그리고 INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) 구문을 통해 매월 새로운 파티션이 자동으로 생성되도록 설정합니다. 즉, order_date가 2020년 2월의 데이터를 포함하게 되면, 2020년 2월을 위한 새로운 파티션이 자동으로 생성되고, 이후 각 달에 대해 동일한 프로세스가 반복됩니다.
수직 파티셔닝은 오라클에서 직접적으로 지원하는 기능은 아니지만, 다른 방식으로 구현할 수 있습니다. 데이터를 다른 테이블로 분리하고, 이를 참조 또는 조인하여 사용할 수 있습니다.
리스트 파티셔닝은 특정 열의 명시적인 값 리스트를 기준으로 행을 분할합니다. 예를 들어, products 테이블에서 category_id를 기준으로 분할할 수 있습니다.
CREATE TABLE products (
product_id NUMBER,
product_name VARCHAR2(50),
category_id NUMBER
)
PARTITION BY LIST (category_id) (
PARTITION p_electronics VALUES (1, 2, 3),
PARTITION p_clothing VALUES (4, 5, 6),
PARTITION p_furniture VALUES (7, 8, 9)
);
해시 파티셔닝은 해시 함수를 사용하여 데이터를 분할합니다. 이 방법은 데이터를 균등하게 분배하는 데 유용합니다. 예를 들어, customers 테이블에서 customer_id를 기준으로 데이터를 분할할 수 있습니다.
CREATE TABLE customers (
customer_id NUMBER,
customer_name VARCHAR2(50),
address VARCHAR2(100)
)
PARTITION BY HASH (customer_id) PARTITIONS 4;