본문 바로가기
DB/SQL튜닝

SQL튜닝이론 - 테이블 파티셔닝을 통한 DML 성능향상 (RANGE 파티션, HASH 파티션, LIST 파티션

by 참외롭다 2024. 2. 7.
반응형

SQL튜닝이론 - 테이블 파티셔닝을 통한 DML 성능향상 (RANGE 파티션, HASH 파티션, LIST 파티션

 

테이블 또는 인덱스 데이터를 칼럼의 값을 기준으로 별도의 세그먼트에 분할 저장하는 것을 파티셔닝이라고 합니다. 예를 들어 이력데이터를 월별, 분기별, 반기별, 연별로 분할해서 저장해 두면 빠른 조회와 관리가 용이합니다. 파티션은 일반적으로 시계열에 따라 범위로 분할하지만 리스트 혹은 해시 방식으로 분할할 수도 있습니다. 대표적인 파티션에는 RANGE, HASH, 리스트 3종류가 있습니다.

 

RANGE 파티션

 

가장 기초적인 파티션 방식으로 시계열 데이터를 기준으로 파티셔닝 합니다.

 

create table 주문 (주문번호 number, 주문일자 varchar2(8), 고객ID varchar2(5), 배송일자 varchar2(8), 주문금액 number, ...)
partition by range(주문일자) (
    partition P2017_Q1 values less then ('20170401')
  partition P2017_Q2 values less then ('20170701')
  partition P2017_Q3 values less then ('20171001')
  partition P2017_Q4 values less then ('20180101')
  partition P2018_Q1 values less then ('20180401')
  partition P9999_MX values less then (MAXVALUE) -- 주문일자 >= '20180401'
)

 

위와 같이 생성한 파티션 테이블에 값을 입력하면 각 레코드를 파티션 키 값에 따라 분할해서 저장합니다. 읽을 때도 검색 조건을 만족하는 파티션에서만 탐색할 수 있어 FULL SCAN 방식으로 조회할 때 성능을 크게 향상할 수 있습니다. 파티션 테이블을 이용한 SQL 성능향상을 가능하게 하는 것은 PARTITION PRUNING입니다. PARTITION PRUNING은 SQL 하드파싱이나 실행 시점에서 조건절을 분석해 읽지 않아도 되는 파티션 세그먼트를 액세스 대상에서 제외하는 기능입니다.

 

SELECT *
FROM 주문
WHERE 주문일자 >= '20120401'
AND 주문일자 <= '20120630'

 

주문테이블은 1200만건의 레코드가 있는 대용량 데이터입니다. 조건절을 만족하는 데이터는 300만 건으로 이 정도 데이터를 인덱스로 스캔하고 랜덤 액세스하면 테이블 전체를 스캔하는 것보다 성능이 낮습니다. FULL SCAN도 많은 시간을 소요합니다. 이때 파티셔닝을 통해 조건에 해당하는 파티션 세그먼트만 FULL SCAN 한다면 성능향상에 큰 도움이 됩니다.

 

파티션도 클러스터 IOT와 마찬가지로 관련있는 데이터가 흩어지지 않고 물리적으로 인접하게 저장하는 클러스터링 기술에 속합니다. 다른 점은 세그먼트 단위로 모아서 저장한다는 점입니다. 클러스터는 데이터블록 단위로 모아 저장합니다.

 

해시 파티션

 

컬럼 값에 대한 해시 함수 결과가 같은 레코드끼리 같은 세그먼트에 저장하는 방식입니다. 고객 ID처럼 변별력이 좋고 데이터 분포가 고른 칼럼을 파티션 기준으로 선정해야 효과적입니다. 검색할 때는 조건절에 사용된 비교값에 동일한 해시 함수를 적용해 탐색 대상 파티션을 결정합니다. 해시 알고리즘의 특성상 등치조건 또는 IN-LIST 조건으로 검색할 때만 파티션 PRUING이 작동합니다.

 

-- 고객 ID 기준으로 고객 테이블을 해시 파티셔니하는 방법에 대한 예시다.
create table 고객(고객ID varchar2(5), 고객명 varchar2(10), ..._
partition by hash(고객ID) partitions 4;

 

리스트 파티션

 

사용자가 정의한 기준에 따라 데이터를 분할 저장합니다.

 


-- 지역분류 기준으로 인터넷매물 테이블을 리스트 파티셔닝하는 방법이다.
create table 인터넷매물 (물건코드 varchar2(5), 지역분류 varchar2(4), ...)
partition by range(지역분류) (
  partition P_지역1 values  ('서울')
  partition P_지역2 values  ('경기', '인천')
  partition P_지역3 values  ('부산', '대구','대전', '광주')
  partition P_기타 values  (DEFAULT)
)

 

RANGE 파티션은 값의 순서에 따라 저장할 파티션이 결정되지만, 리스트 파티션에서는 순서와 상관없이 불연속적인 값의 목록에 의해 결정됩니다. 업무적인 친화도에 따라 그룹핑 기준을 정하고 각 파티션에 값이 고르게 분산되도록 해야합니다.

반응형