DB 파티셔닝(Database Partitioning)
데이터를 효율적으로 관리하고 성능을 향상시키기 위해 데이터를 여러 파티션(부분)으로 나누는 방법입니다. 데이터가 너무 커져서 하나의 테이블이나 인덱스로 관리하기 어려울 때 사용됩니다.
파티셔닝의 장단점
장점
- 성능 개선 - 특정 파티션에 대해서만 작업을 수행하므로 속도가 빨라짐.
- 관리 용이 - 파티션 단위로 백업, 복구 가능.
- 확장성 - 데이터가 증가해도 새로운 파티션을 추가해 확장 가능.
단점
- 복잡성 증가 - 파티션을 관리하기 위한 추가 작업 필요.
- 잘못된 파티셔닝 - 비효율적인 파티셔닝은 오히려 성능을 저하시킬 수 있음.
이제 본격적으로 데이터 파티셔닝의 예를 들어보도록 하겠습니다.
원본 데이터
아래와 같은 형태의 Orders 테이블이 있다고 가정하겠습니다.
OrderId |
OrderDate |
CustomerID |
Amount |
1 |
2022-01-15 |
100 |
250.00 |
2 |
2022-05-23 |
101 |
150.00 |
3 |
2023-03-10 |
102 |
300.00 |
4 |
2023-07-19 |
103 |
400.00 |
5 |
2024-02-20 |
104 |
500.00 |
범위 파티셔닝 (Range Partitioning)
특정 열의 값을 기준으로 범위를 나누어 파티셔닝 하는 방법을 의미합니다.
여기에선 날짜를 기준으로 2022년 데이터, 2023년 데이터 등으로 나눠보도록 해보죠.
CREATE TABLE Orders (
OrderID int,
OrderDate date,
CustomerID int,
Amount decimal
)
PARTITION BY RANGE (YEAR(OrderDate)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
);
이렇게 했을 때 데이터는 아래와 같이 나눌 수 있습니다.
p2022 파티션
OrderId |
OrderDate |
CustomerID |
Amount |
1 |
2022-01-15 |
100 |
250.00 |
2 |
2022-05-23 |
101 |
150.00 |
p2023 파티션
OrderId |
OrderDate |
CustomerID |
Amount |
3 |
2023-03-10 |
102 |
300.00 |
4 |
2023-07-19 |
103 |
400.00 |
p2024 파티션
OrderId |
OrderDate |
CustomerID |
Amount |
5 |
2024-02-20 |
104 |
500.00 |
장점
- 간단하고 직관적 - 날짜, 금액 등 연속적인 값을 기준으로 쉽게 이해하고 적용할 수 있습니다.
- 효율적인 쿼리 성능 - 특정 범위에 대한 검색, 삽입, 삭제 등의 작업이 빠릅니다.
- 관리가 용이 - 특정 기간의 데이터만 백업하거나 아카이브하는 것이 용이합니다.
단점
- 데이터 불균형 - 특정 범위에 데이터가 몰리면 일부 파티션에 부하가 집중될 수 있습니다.
- 확장성 문제 - 새로운 범위의 데이터를 추가할 때 기존 테이블의 재구성이 필요할 수 있습니다.
언제 사용하면 좋은가?
- 시간 기반 데이터 - 로그 데이터, 주문 기록 등 시간에 따라 자연스럽게 나눌 수 있는 데이터.
- 연속적 범위의 데이터 - 금액, 연령대 등 연속된 값으로 나눌 수 있는 데이터.
해시 파티셔닝 (Hash Partitioning)
해시 함수에 의해 데이터를 분산시켜 파티셔닝하는 방식입니다. 여기에서는 CustomerID를 기준으로 해시 값을 이용해 4개의 파티션으로 나눠보겠습니다.
CREATE TABLE Orders (
OrderID int,
OrderDate date,
CustomerID int,
Amount decimal
)
PARTITION BY HASH(CustomerID) PARTITIONS 4;
Partition 1
OrderId |
OrderDate |
CustomerID |
Amount |
1 |
2022-01-15 |
100 |
250.00 |
Partition 2
OrderId |
OrderDate |
CustomerID |
Amount |
2 |
2022-05-23 |
101 |
150.00 |
Partition 3
OrderId |
OrderDate |
CustomerID |
Amount |
3 |
2023-03-10 |
102 |
300.00 |
Partition 4
OrderId |
OrderDate |
CustomerID |
Amount |
4 |
2023-07-19 |
103 |
400.00 |
5 |
2024-02-20 |
104 |
500.00 |
장점
- 균등한 데이터 분포 - 해시 함수에 의해 데이터가 고르게 분산됩니다.
- 확장성 - 파티션 수를 쉽게 조정할 수 있으며, 데이터가 고르게 분포되므로 부하가 적습니다.
단점
- 비직관적 - 해시 함수의 결과에 따라 데이터가 분산되므로, 특정 파티션에 어떤 데이터가 있는지 예측하기 어렵습니다.
- 범위 쿼리에 비효율적 - 특정 범위의 데이터를 검색할 때 모든 파티션을 탐색해야 할 수 있습니다.
언제 사용하면 좋은가?
- 균등한 데이터 분포가 필요한 경우 - 고객 ID, 주문 ID 등 데이터의 균등 분포가 중요한 경우.
- 고정된 데이터 접근 패턴 - 특정 데이터에 대한 접근이 균등하게 분산되어야 할 때.
리스트 파티셔닝 (List Partitioning)
특정 값들의 리스트를 기준으로 파티셔닝하는 방식입니다. 여기에서는 RegionCode가 있다고 가정하고 이를 기준으로 데이터를 나누어 보겠습니다.
CREATE TABLE Orders (
OrderID int,
OrderDate date,
CustomerID int,
Amount decimal,
RegionCode varchar(50)
)
PARTITION BY LIST (RegionCode) (
PARTITION East VALUES IN ('East'),
PARTITION West VALUES IN ('West'),
PARTITION North VALUES IN ('North'),
PARTITION South VALUES IN ('South')
);
East 파티션
OrderId |
OrderDate |
CustomerID |
Amount |
RegionCode |
1 |
2022-01-15 |
100 |
250.00 |
East |
West 파티션
OrderId |
OrderDate |
CustomerID |
Amount |
RegionCode
|
2 |
2022-05-23 |
101 |
150.00 |
West |
North 파티션
OrderId |
OrderDate |
CustomerID |
Amount |
RegionCode |
3 |
2023-03-10 |
102 |
300.00 |
North |
South 파티션
OrderId |
OrderDate |
CustomerID |
Amount |
RegionCode
|
4 |
2023-07-19 |
103 |
400.00 |
South |
5 |
2024-02-20 |
104 |
500.00 |
South |
장점
- 유연한 분할 기준 - 특정 값의 집합에 따라 유연하게 데이터를 나눌 수 있습니다.
- 직관적 관리 - 특정 값에 따라 데이터를 쉽게 분류하고 관리할 수 있습니다.
단점
- 복잡한 관리 - 관리해야 할 파티션의 수가 많아질 수 있으며, 값의 추가/변경 시 테이블 재구성이 필요할 수 있습니다.
- 데이터 불균형 - 값의 분포에 따라 파티션에 데이터가 불균형하게 분포될 수 있습니다.
언제 사용하면 좋은가?
- 명확한 분류 기준이 있는 경우 - 지역, 카테고리 등 명확한 값의 집합으로 데이터를 나눌 수 있는 경우.
- 비정형 데이터 분포- 특정 값들에 따라 데이터를 분류하고 관리할 때.
컴포지트 파티셔닝 (Composite Partitioning)
컴포지트 파티셔닝은 두 가지 이상의 파티셔닝 방법을 결합하여 사용하는 방법입니다. 예를 들어, OrderDate를 기준으로 범위 파티셔닝을 먼저 하고, 각 범위 내에서 CustomerID를 기준으로 해시 파티셔닝을 적용할 수 있습니다.
CREATE TABLE Orders (
OrderID int,
OrderDate date,
CustomerID int,
Amount decimal
)
PARTITION BY RANGE (YEAR(OrderDate)) (
PARTITION p2022 VALUES LESS THAN (2023) (
PARTITION BY HASH(CustomerID) PARTITIONS 2
),
PARTITION p2023 VALUES LESS THAN (2024) (
PARTITION BY HASH(CustomerID) PARTITIONS 2
),
PARTITION p2024 VALUES LESS THAN (2025) (
PARTITION BY HASH(CustomerID) PARTITIONS 2
)
);
2022 파티션
p2022_1
OrderId |
OrderDate |
CustomerID |
Amount |
1 |
2022-01-15 |
100 |
250.00 |
P2022_2
OrderId |
OrderDate |
CustomerID |
Amount |
2 |
2022-05-23 |
101 |
150.00 |
p2023 파티션
p2023_1
OrderId |
OrderDate |
CustomerID |
Amount |
3 |
2023-03-10 |
102 |
300.00 |
p2023_1
OrderId |
OrderDate |
CustomerID |
Amount |
4 |
2023-07-19 |
103 |
400.00 |
p2024 파티션
p2024_1
OrderId |
OrderDate |
CustomerID |
Amount |
5 |
2024-02-20 |
104 |
500.00 |
장점
- 다양한 분할 기준 적용 - 두 가지 이상의 파티셔닝 방법을 결합하여 데이터 분포를 최적화할 수 있습니다.
- 유연한 관리 - 복잡한 데이터 세트를 효과적으로 관리할 수 있습니다.
단점
- 복잡한 설계 - 두 가지 이상의 파티셔닝 방법을 결합하기 때문에 설계와 관리가 복잡합니다.
- 성능 문제 - 잘못된 조합을 사용할 경우 오히려 성능이 저하될 수 있습니다.
언제 사용하면 좋은가?
- 복잡한 데이터 세트 - 다양한 기준으로 데이터를 나누어야 할 때.
- 다양한 쿼리 패턴 - 여러 가지 쿼리 패턴이 혼합되어 있는 경우.
요약
파티셔닝 방법 |
장점 |
단점 |
사용 시점 |
범위 파티셔닝 |
간단하고 직관적, 효율적인 쿼리 성능, 관리 용이 |
데이터 불균형, 확장성 문제 |
시간 기반 데이터, 연속적 범위의 데이터 |
해시 파티셔닝 |
균등한 데이터 분포, 확장성 |
비직관적, 범위 쿼리에 비효율적 |
균등한 데이터 분포가 필요한 경우, 고정된 데이터 접근 패턴 |
리스트 파티셔닝 |
유연한 분할 기준, 직관적 관리 |
복잡한 관리, 데이터 불균형 |
명확한 분류 기준이 있는 경우, 비정형 데이터 분포 |
컴포지트 파티셔닝 |
다양한 분할 기준 적용, 유연한 관리 |
복잡한 설계, 성능 문제 |
복잡한 데이터 세트, 다양한 쿼리 패턴 |
DB 파티셔닝은 대규모 데이터베이스 관리에서 매우 유용한 기법입니다. 파티셔닝 방법을 잘 선택하고, 적절히 관리하면 데이터베이스 성능을 크게 향상시킬 수 있습니다. 초보자라면 먼저 범위 파티셔닝과 해시 파티셔닝을 이해하고, 이후 리스트 파티셔닝이나 컴포지트 파티셔닝을 학습하는 것을 추천드립니다.