1-1. Partition의 개념
대용량의 테이블(table)이나 인덱스(index)를 파티셔닝(Partitioning)한다는 것은 하나의 오브젝트(Object)가 여러 개의 세그먼트(Segment)로 구성된다는 의미입니다. 이는 하나의 테이블이나 인덱스가 동일한 논리적 속성을 가진 여러 개의 단위(파티션)로 나누어져 각각이 별도의 물리적 속성(PCTFREE, PCTUSED, INITRANS, MAXTRANS, TABLESPACE 및 STORAGE PARAMETER 등)을 가질 수 있게 되는 것입니다. 관리하는 데이터가 대용량이 되면서 성능 및 저장 공간 관점에서 문제가 생길 수 있는데, 이를 해결할 수 있는 방법이 바로 파티셔닝입니다. 따라서 다음과 같은 장점이 있습니다.
- 데이터 액세스 시(특히 전체 스캔 시) 액세스 범위를 줄여 성능을 향상시킬 수 있습니다.
- 물리적으로 여러 영역으로 파티셔닝하여 전체 데이터의 훼손 가능성이 감소하여 데이터 가용성이 향상됩니다.
- 각 파티션별로 별도로 백업 및 복구 작업을 할 수 있습니다.
- 디스크 I/O의 분산을 테이블의 파티션 단위로 하여 I/O 경합을 줄일 수 있습니다.
Oracle DBMS에서 제공하는 파티셔닝 방식에는 Range Partitioning, Hash Partitioning, List Partitioning, Composite Partitioning(Range-Hash, Range-List)가 있습니다.
1-2. Partition의 종류
1) Range Partitioning
Range Partition은 특정 컬럼 값의 정렬 값을 기준으로 분할하는 것입니다. 주로 히스토리컬 데이터를 관리하는 테이블에 많이 적용됩니다. 예를 들어 “가입계약”이라는 테이블에 몇 년 동안 데이터가 쌓여있을 때, 이를 연도별 또는 월별로 파티셔닝하고 데이터 조회 애플리케이션의 SQL 액세스 경로를 조정하여 전체 데이터가 아닌 최근 정보를 가진 파티션만 액세스하도록 하여 성능을 향상시킬 수 있습니다. Range Partition을 만드는 DDL 스크립트는 다음과 같습니다.
CREATE TABLE CONTRACT
(
I_YYYYMMDD VARCHAR2(8),
I_CUSTOMER VARCHAR2(9),
…
)
TABLESPACE TBS1
STORAGE (INITIAL 2M NEXT 2M PCTINCREASE 0)
PARTITION BY RANGE (I_YYYYMMDD)
(
PARTITION PAR_200307 VALUES LESS THAN ('20030801'),
PARTITION PAR_200308 VALUES LESS THAN ('20030901'),
…
)
- PARTITION BY RANGE (COLUMN_LIST): 어떤 컬럼을 기준으로 파티셔닝할 것인지 정합니다.
- VALUES LESS THAN (VALUE_LIST): 해당 파티션이 어느 범위에 포함될 것인지 상한값을 정합니다.
2) Hash Partitioning
Hash Partitioning은 특정 컬럼 값에 해시 함수(Hash Function)를 적용하여 분할하는 방식으로, 데이터 관리 목적보다는 성능 향상을 목적으로 합니다. 일정한 분포를 가진 파티션으로 나누고 균등한 분포도를 이용한 병렬 처리로 성능을 높이는 것입니다. Hash Partition을 만드는 DDL 스크립트는 다음과 같습니다.
CREATE TABLE CONTRACT
(
SERIAL NUMBER,
CODE VARCHAR2(4),
…
)
TABLESPACE TBS1
STORAGE (INITIAL 2M NEXT 2M PCTINCREASE 0)
PARTITION BY HASH (SERIAL)
(
PARTITION PAR_HASH_1 TABLESPACE TBS2,
PARTITION PAR_HASH_2 TABLESPACE TBS3,
…
)
3) List Partitioning
List Partitioning은 특정 컬럼의 특정 값으로 파티셔닝을 하는 방식입니다. 주로 고유 값의 수가 많지 않고, 그 고유 값별로 분포도가 비슷하며 많은 SQL의 액세스 경로에서 해당 컬럼의 조건이 많이 들어오는 경우 유용합니다. List Partition을 만드는 DDL 스크립트는 다음과 같습니다.
CREATE TABLE SERVICE_CONTRACT
(
I_YYYYMMDD VARCHAR2(8),
I_CUSTOMER VARCHAR2(6),
I_DLR_IND VARCHAR2(2),
I_DEALER VARCHAR2(6),
…
)
TABLESPACE TBS1
STORAGE (INITIAL 2M NEXT 2M PCTINCREASE 0)
PARTITION BY LIST (I_DLR_IND)
(
PARTITION PAR_A VALUES ('A'),
PARTITION PAR_S VALUES ('S')
)
4) Composite Partitioning (Range-Hash)
Range-Hash Composite Partitioning은 Range 방식을 사용하여 데이터를 파티셔닝하고, 각 파티션 내에서 해시(Hash) 방식을 이용하여 서브 파티셔닝(Sub-Partitioning)하는 방식입니다. Range-Hash Composite Partition을 생성하는 DDL 스크립트는 다음과 같습니다.
CREATE TABLE TB_RANGE_HASH
(
I_YYYYMMDD VARCHAR2(8),
I_SERIAL NUMBER,
SALE_PRICE NUMBER,
…
)
TABLESPACE TBS1
STORAGE (INITIAL 2M NEXT 2M PCTINCREASE 0)
PARTITION BY RANGE (I_YYYYMMDD)
SUBPARTITION BY HASH (I_SERIAL)
(
PARTITION SALES_1997 VALUES LESS THAN ('19980101')
(
SUBPARTITION SALES_1997_Q1 TABLESPACE TBS2,
SUBPARTITION SALES_1997_Q2 TABLESPACE TBS3
),
…
)
5) Composite Partitioning (Range-List)
Range-List Composite Partitioning은 Range 방식을 사용하여 데이터를 파티셔닝하고, 각 파티션 내에서 리스트(List) 방식을 이용하여 서브 파티셔닝(Sub-Partitioning)하는 방식입니다. Range-List Composite Partition을 생성하는 DDL 스크립트는 다음과 같습니다.
CREATE TABLE TB_RANGE_LIST
(
I_YYYYMMDD VARCHAR2(8),
I_AGR_IND VARCHAR2(2),
I_DELAER VARCHAR2(6),
…
)
TABLESPACE TBS1
STORAGE (INITIAL 2M NEXT 2M PCTINCREASE 0 MAXEXTENTS UNLIMITED)
PARTITION BY RANGE (I_YYYYMMDD)
SUBPARTITION BY LIST (I_AGR_IND)
(
PARTITION PAR_1997 VALUES LESS THAN ('19980101')
(
SUBPARTITION PAR_1997_A VALUES ('A'),
SUBPARTITION PAR_1997_S VALUES ('S')
),
…
)