관계형 데이터베이스에서 대용량 데이터의 처리 성능과 관리의 편의성을 위한 테이블 파티셔닝은 필수 요구 기능이다.  이 기능은 테이블 데이터가 하나 이상의 컬럼 값에 의해 파티션이라고 하는 복수의 오브젝트로 분할한다.  파티셔닝의 가장 큰 장점은 조회성능 개선을 들 수 있다. 대용량 테이블 전체를 검색하는 대신에  목표 데이터가 포함된 일부 파티션만 검색하므로써, 데이터 IO처리를 효율적으로 수행할 수 있다.  검색에서 제외되는 파티션이 많을수록 파티셔닝의 효과는 커진다. 

테이블 파티셔닝의 적용으로 다양한 장점 및 효과를 얻을 수 있다.

  • 데이터 보관 주기 관리 – 데이터 보관 주기에 맞도록 효율적 관리가 가능하다. 파티션 된 테이블 데이터를 롤인(Roll-in)하면 새 행을 쉽게 파티션 된 테이블에 추가하여 테이블에 통합할 수 있고 파티션 된 테이블 데이터를 롤아웃(Roll-out) 하면 제거하거나 또는 별도 테이블로 분리 가능
  • 대형 테이블 관리 용이 – 개별 데이터 파티션에 대해 관리 태스크를 수행할 수 있으므로 테이블 수준 관리가 용이하다. 이러한 태스크에는 개별 데이터 파티션의 백업 및 리스토어, 개별 파티션 재구성등이 포함된다.
  • 쿼리 성능 개선 –  쿼리의 술어를 기본으로 자동으로 데이터 파티션을 제거할 수  있다. 데이터 파티션 제거(elimination)라고 하는 이 기능은 여러 의사 결정 지원 쿼리에 도움이 된다.

 

분할 요건에 따라 Range, List, Hash 기법으로 파티션 테이블을 생성할 수 있다. 

1. Range 파티셔닝

Range 파티션은 테이블 데이터가 하나 이상의 컬럼 값에 따라 범위 파티션이라고 하는 복수의 오브젝트로 분산한다. 각 오브젝트는 동일한 테이블 스페이스 혹은 다른 테이블 스페이스에 저장될 수 있다. 

  • 컬럼 값 범위를 기준으로 행을 분할하는 형태
  • Range Partition에서 Table은 단지 논리적인 구조이며 실제 데이터가 물리적으로 저장은 Partition으로 나누어 Tablespace에 저장
  • PARTITION BY RANGE(컬럼목록): 범위를 나눌 기준 컬럼 목록 명시

 

CREATE TABLE "TPCH    "."CUSTOMER_RANGE"  (
                  "C_CUSTKEY" INTEGER NOT NULL ,
                  "C_NAME" VARCHAR(25 OCTETS) NOT NULL ,
                  "C_ADDRESS" VARCHAR(40 OCTETS) NOT NULL ,
                  "C_NATIONKEY" INTEGER NOT NULL ,
                  "C_PHONE" CHAR(15 OCTETS) NOT NULL ,
                  "C_ACCTBAL" DECIMAL(15,2) NOT NULL ,
                  "C_MKTSEGMENT" CHAR(10 OCTETS) NOT NULL ,
                  "C_COMMENT" VARCHAR(117 OCTETS) NOT NULL )
(PARTITION BY RANGE (C_MKTSEGMENT)
(PART P1 STARTING 'AUTOMOBILE' ENDING 'AUTOMOBILE' IN TBSP1,
PART P2 STARTING 'BUILDING' ENDING 'BUILDING' IN TBSP2,
PART P3 STARTING 'FURNITURE' ENDING 'FURNITURE' IN TBSP3,
PART P4 STARTING 'HOUSEHOLD' ENDING 'HOUSEHOLD' IN TBSP4,
PART P5 STARTING 'MACHINERY' ENDING 'MACHINERY' IN TBSP5)
COMPRESS YES ADAPTIVE;

 

2. List 파티셔닝

List 파티션은 테이블 데이터가 특정 컬럼 값을 리스트로 나누고 각 값에 따라 파티션이라고 하는 복수의 오브젝트로 분산한다. 각 오브젝트는 동일한 테이블 스페이스 혹은 다른 테이블 스페이스에 저장될 수 있다.

•Column의 특정 값으로 Partitioning을 하는 방법
•키 값의 list를 작성하고, 이 키 값의 리스트에 따라 나누어짐
•장점 – 연관되지 않은 데이터, 순서에 맞지 않는 데이터의 grouping 을 손쉽게 구현
•값별로 분포도가 비슷하며, 많은 SQL에서 해당 Column의 조건을 사용하는 경우 유용

 

 

 

 

 

CREATE TABLE "TPCH    "."CUSTOMER_LIST"  (
                  "C_CUSTKEY" INTEGER NOT NULL ,
                  "C_NAME" VARCHAR(25 OCTETS) NOT NULL ,
                  "C_ADDRESS" VARCHAR(40 OCTETS) NOT NULL ,
                  "C_NATIONKEY" INTEGER NOT NULL ,
                  "C_PHONE" CHAR(15 OCTETS) NOT NULL ,
                  "C_ACCTBAL" DECIMAL(15,2) NOT NULL ,
                  "C_MKTSEGMENT" CHAR(10 OCTETS) NOT NULL ,
                  "C_COMMENT" VARCHAR(117 OCTETS) NOT NULL ,
                  "C_MKTSEGMENT_LIST" GENERATED ALWAYS AS
(CASE
WHEN C_MKTSEGMENT = 'AUTOMOBILE' THEN 1
WHEN C_MKTSEGMENT = 'BUILDING' THEN 2
WHEN C_MKTSEGMENT = 'FURNITURE' THEN 3
WHEN C_MKTSEGMENT = 'HOUSEHOLD' THEN 4
WHEN C_MKTSEGMENT = 'MACHINERY'  THEN 5
) IMPLICITLY HIDDEN
) PARTITION BY RANGE (C_MKTSEGMENT_LIST)
(STARTING 1 ENDING 5 EVERY 1)
IN TBSP1, TBSP2, TBSP3,TBSP4,TBSP5 COMPRESS YES ADAPTIVE  ;

 

3. Hash 파티셔닝

Hash 파티션은 테이블 데이터가 특정 컬럼 값에 따라 해쉬 파티션이라고 하는 복수의 오브젝트에 분산된다. 각 오브젝트는 서로 다른 각각의 테이블 스페이스에 저장될 수 있으며 쿼리는 병렬처리 된다.

  • Partitioning column의 Partitioning Key 값에 Hash 함수를 적용하여 Data를 여러 파티션으로 분할
  • 대용량 데이터를 균등한 분포로 여러 파티션으로 나누고 병렬처리 기능으로 처리 성능 개선

 

 

 

 

 

 

CREATE TABLE "TPCH    "."CUSTOMER_HASH"  (
                  "C_CUSTKEY" INTEGER NOT NULL ,
                  "C_NAME" VARCHAR(25 OCTETS) NOT NULL ,
                  "C_ADDRESS" VARCHAR(40 OCTETS) NOT NULL ,
                  "C_NATIONKEY" INTEGER NOT NULL ,
                  "C_PHONE" CHAR(15 OCTETS) NOT NULL ,
                  "C_ACCTBAL" DECIMAL(15,2) NOT NULL ,
                  "C_MKTSEGMENT" CHAR(10 OCTETS) NOT NULL ,
                  "C_COMMENT" VARCHAR(117 OCTETS) NOT NULL ,
                  "C_CUSTKEY_HASH" SMALLINT NOT NULL IMPLICITLY HIDDEN GENERATED ALWAYS AS (MOD(HASH4(CHAR(C_CUSTKEY)),2)) )
PARTITION BY RANGE (C_CUSTKEY_HASH)
(
  PART p1 STARTING(-2) ENDING(-2) IN tbsp1 ,
  PART p2 STARTING(-1) ENDING(-1) IN tbsp2 ,
  PART p3 STARTING(0)  ENDING(0)  IN tbsp3 ,
  PART p4 STARTING(1)  ENDING(1)  IN tbsp4 ,
  PART p5 STARTING(2)  ENDING(2)  IN tbsp5
) COMPRESS YES ADAPTIVE ;


이상으로 Db2에서 대용량 테이블의 관리와 성능을 개선시킬 수 있는  테이블 파티셔닝 방법에 대해 살펴보았다.   데이터 파티셔닝 요건에  따라 Range,List, Hash중 선택 적용해보자.