파티셔닝

K·2022년 5월 23일
0

1. 테이블 파티셔닝

  • 테이블 파티셔닝시 논리적으로는 테이블로 접근, 물리적으로는 테이블내 각각의 파티션으로 접근
  • 각각 파티션은 세그먼트에 해당, 세그먼트는 테이블과 거의 1:1구조이지만, 파티션 테이블은 파티션과 1:1구조
  • 성능개선을 위해 사용, 서점에서 영역별로 책을분류해 찾기쉽도록한것과 유사한개념.
  • 단일테이블에 데이터삭제시 DML(DELETE)문으로 삭제, 부담스러울수있음, 파티션테이블은 해당테이블을 DDL로 쉽게삭제가능
  • 파티션 테이블 종류
    • 리스트 파티션 : 파티션 키 컬럼이 값으로 지정
    • RANGE 파티션 : 파티션 키 컬럼이 값의 범위로 지정됨
    • 해시 파티션 : 파티션 키 컬럼의 값을 오라클 내부에서 지정

1.1 Range 파티션

  • 가장일반적으로 쓰이는 파티션, 데이터많이누적되는 테이블에서 기준이 모호할때 날짜를 기준으로 파티션, 파티션 키컬럼을 정하기 매우쉬운장점.

  • LESS THAN안의 값을 포함하지않음

  • P_DEFAULT파티션은 파티션을 추가해야하는데 못했을때 에러방지.

  • 파티션 키 컬럼의 값이 범위를 가지고 있다.

  • 아래예제에서 주문일자(ORD_DT)컬럼은 월단위로 나뉘어 저장, 주문일자달라도 월 데이터는 물리적으로 하나의 파티션에 저장

  • 만약 1월15~25일까지 데이터를 SQL문으로 조회한다면 1월파티션만 읽어 집합을 만들 수있음.

    CREATE TABLE ORD_RANGE(
    ORD_NO NUMBER(1) NOT NULL
    ,ORD_DT VARCHAR2(8) NOT NULL
    ,...
    )
    PARTITION BY RANGE(ORD_DT)
    (
    PARTITION P201201 VALUES LESS THAN('201202')
    ,PARTITION P201202 VALUES LESS THAN('201203')
    , PARTITION P_DEFAULT VALUE LESS THAN (MAXVALUE)
    )

1.2 리스트 파티션

  • 리스트 파티션은 키 컬럼의 값이 설정한 값과 일치할 경우 사용.
  • 1월데이터에 청구년월의 1월에 해당하는 값을 입력하도록 한것.
  • P_DEFAULT는 지정하지않은 값이 입력될때, 위치하는 파티션.

    CREATE TABLE BILL_LIST (
    BILL NO NUMBER(10) NOT NULL
    , BILL_YM VARCHAR2(6) NOT NULL /*청구년월*/
    , ...
    )
    PARTITION BY LIST (BILL_YM)
    (
    PARTITION P201201 VALUES('201201')
    , PARTITION P201202 VALUES('201202')
    ...
    , PARTITION P_DEFAULT VALUES (DEFAULT)
    )

  • 리스트 파티션 예제
  • 연관성이 높은 카테고리를 묶으면 조회시 같은 파티션내에서만 읽고 처리가능
  • 이런 경우 분류를 잘못하면 특정 파티션에 데이터가몰리고, 연관성이 높지안항 여러 파티션을 읽어야하는경우발생 > 직접분류시 주의

    CREATE TABLE 판매도서LIST(
    도서번호 NUMBER(10) NOT NULL
    , 도서카테고리 VARCHAR2(6) NOT NULL
    , 판매자ID VARCHAR2(10)
    , ....
    )
    PARTITION BY LIST (도서카테고리)
    (
    PARTITION P
    카테고리01 VALUES('소설','문학')
    ,PARTITION P_카테고리02 VALUES('경제','경영','재테크')
    ,PARTITION P_DEFAULT VALUES (DEFAULT)
    )

1.3 해시 파티션

  • 키 컬럼의 값을 해시 함수를 이용해 지정한 파티션의 개수로 나누어 저장
  • 리스트파티션에서 사람이 데이터를 분류하면, 해시파티션은 오라클이 해시 함수로 데이터를 분산시켜줌.
  • 키 컬럼을 정할대, 데이터 분포를 고려해야함, 해시 알고리즘은 동일입력 동일 출력임.
  • 해시 파티션사용시 가급적 값이 많지않은 컬럼을 사용해야 효과를 볼수있고, 등치조건과 IN조건만 사용할수있고, 범위조건인 부등호와 BETWEEN 조건으로 사용될 가능성이있는 컬럼은 상요하지않는것이 좋다. (주문일자대신 주문번호를 키값으로 설정함)

    CREATE TABLE ORD_HASH(
    ORD_NO NUMBER(10) NOT NULL
    ,ORD DT VARCHAR2(8)
    ,...
    )
    PARTITION BY HASH (ORD_NO) PARTITIONS 8;

1.5 파티션별 특징

  • RANGE : 가장 상식정, 파티션키 컬럼정하기 쉬움, 각 파티션의 데이터의 분포가 어느정도 비슷
  • LIST : 키컬럼 잡기 어려움, 실무에서 주로 지역이나 업무적으로 사용하는 카테고리같은 컬럼을 사용하는데, 데이터 분포를 사람이 맞춰야해서 파티션마다 분포가 차이날수있음
  • HASH : 별의미가없고, 파티션개수만 지정한것외 특별한게없음 > 복합파티션 기능제공.

1.6 복합 파티셔닝

  • 테이블 파티션 예정이라면 처음부터 복합 파티션을 고려하는게 좋다.
  • 각각 파티션 특징이 제한적이고, 파티션을 사용하는 목적이 주로 파티션단위로 수행되기때문.
  • 복합파티션을 만들때, 삭제와 조회기준으로 전략을 짜면 매우 좋음
  • 메인-서브구조 : "리스트-RANGE", "리스트-리스트" 등등~~~
  • 만약 어떤 테이블에서 오래된 데이터를 삭제하는 일이 빈번하고, 특정 컬럼과 조인을 자주한다면 "RANGE(삭제기준컬럼)-해시(조인기준컬럼)" 또는 "리스트(삭제기준컬럼) - 해시(조인기준컬럼)"의 전략이 단일 파티션을 하는것보다 좋다.
    예를들어 쇼핑몰의 주문테이블이나 통신사 청구테이블의 경우 오래된데이터는 OLTP에서 무한정보관할수없음, 이럴경우 삭제기준컬럼으로 메인파티션을 정하고, 조인기준으로 서브파티션을만드는 전략을 생각해 볼 수 있음.

2. 인덱스 파티셔닝

  • 비파티션 인덱스 : 인덱스는 파티션하지 않음
  • 로컬 파티션 인덱스 : 테이블 파티션과 같은 기준으로 인덱스나눔
  • 글로벌 파티션 인덱스 : 테이블 파티션과는 다른 기준으로 인덱스 나눔
  • 파티션테이블은 대부분 많은 데이터를 가지고있음, 대개 SQL성능향상을 높이기위해 사용한다고생각하지만, 일정기간이 지난 데이터를 삭제하는 경우에 더많은 고려대상이 됨.
    이때 비파티션 인덱스나 글로벌 파티션 인덱스가 있으면 심각해짐, 그래서 삭제이슈가있는 테이블은 최대한 로컬 인덱스를 사용해야함.

3. 파티션 Pruning

  • 테이블 전체를 읽지 않고, 필요한 파티션만 읽을 수 있도록 하는 기능.
  • PARTITION LIST SINLGE명령시 리스트 파티션으로 나뉜 테이블에서 파티션한개를 읽은것.
  • PARTITION RANGE SINGLE RANGE파티션으로 나뉜테이블에서 파티션 읽음
  • UPDATE구문이나 MERGE구문에서도 PRUNING기능이 동작하도록 처리해야함.
profile
늙어가면서 기억을 남기는 개발자

0개의 댓글