테이블 파티션

Range 파티션

CREATE TABLE 주문 (
    주문번호 NUMBER,
    주문일자 VARCHAR2(8),
    고객ID   VARCHAR2(5),
    배송일자 VARCHAR2(8),
    주문금액 NUMBER,
    ...
)
PARTITION BY RANGE (주문일자) (
    PARTITION P2017_Q1 VALUES LESS THAN ('20170401'),
    PARTITION P2017_Q2 VALUES LESS THAN ('20170701'),
    PARTITION P2017_Q3 VALUES LESS THAN ('20171001'),
    PARTITION P2017_Q4 VALUES LESS THAN ('20180101'),
    PARTITION P2018_Q1 VALUES LESS THAN ('20180401'),
    PARTITION P9999_MX VALUES LESS THAN (MAXVALUE) -- 주문일자 >= '20180401'
);
img
SELECT *
  FROM 주문
 WHERE 주문일자 >= '20120401'
   AND 주문일자 <= '20120630';
img

해시 파티션

CREATE TABLE 고객 (
    고객ID VARCHAR2(5),
    고객명 VARCHAR2(10),
    ...
)
PARTITION BY HASH(고객ID) PARTITIONS 4;
img

리스트 파티션

CREATE TABLE 인터넷매물 (
    물건코드 VARCHAR2(5),
    지역분류 VARCHAR2(4),
    ...
)
PARTITION BY LIST(지역분류) (
    PARTITION P_지역1 VALUES ('서울'),
    PARTITION P_지역2 VALUES ('경기', '인천'),
    PARTITION P_지역3 VALUES ('부산', '대구', '대전', '광주'),
    PARTITION P_기타  VALUES (DEFAULT) -- 기타 지역
);
img

인덱스 파티션

img
테이블과 인덱스 파티션 조합 예시

로컬 파티션 인덱스

CREATE INDEX 주문_x01 ON 주문 ( 주문일자, 주문금액 ) LOCAL;
CREATE INDEX 주문_x02 ON 주문 ( 고객ID, 주문일자 ) LOCAL;
img

글로벌 파티션 인덱스

-- 주문금액 + 주문일자로 글로벌 파티션 인덱스 생성
CREATE INDEX 주문_x03 ON 주문 ( 주문금액, 주문일자 ) GLOBAL
PARTITION BY RANGE(주문금액) (
    PARTITION P_01 VALUES LESS THAN ( 100000 ),
    PARTITION P_MX VALUES LESS THAN ( MAXVALUE ) -- 주문금액 >= 100000
);
img

비파티션 인덱스

CREATE INDEX 주문_x04 ON 주문 ( 고객ID, 배송일자 );
img

Prefixed vs Nonprefixed

구분 Prefixed Nonprefixed
로컬 파티션 1 2
글로벌 파티션 3 4 (Not Support)
-- 1. SQL 쿼리
SELECT i.index_name, i.partitioned, p.partitioning_type
     , p.locality, p.alignment
  FROM user_indexes i, user_part_indexes p
 WHERE i.table_name = '주문'
   AND p.index_name(+) = i.index_name
 ORDER BY i.index_name;

/*
-- 2. 실행 결과 데이터
INDEX_NAME    PAR  PARTITION  LOCALI  ALIGNMENT     설명
----------    ---  ---------  ------  ---------     ----
주문_X01      YES  RANGE      LOCAL   PREFIXED      → 로컬 Prefixed 파티션 인덱스
주문_X02      YES  RANGE      LOCAL   NON_PREFIXED  → 로컬 Nonprefixed 파티션 인덱스
주문_X03      YES  RANGE      GLOBAL  PREFIXED      → 글로벌 Prefixed 파티션 인덱스
주문_X04      NO                                    → 비파티션 인덱스
*/

중요한 인덱스 파티션 제약

img
img

파티션을 활용한 대량 UPDATE 튜닝

img
데이터가 10억 건이 있다고 가정

파티션 Exchange를 이용한 대량 데이터 변경

img

파티션을 활용한 대량 DELETE 튜닝

DELETE가 느린 이유

파티션 Drop을 이용한 대량 데이터 삭제

alter table 거래 drop partition p201412;

-- 오라클 11g부터 대상 파티션 지정 가능
alter table 거래 drop partition for('20141201');

파티션 Truncate를 이용한 대량 데이터 삭제

파티션을 활용한 대량 INSERT 튜닝

비파티션 테이블일 때

img
alter table target_t nologging;
alter index target_t_x01 unusable;
insert /*+ append */ into target_t
select * from source_t;
alter index target_t_x01 rebuild nologging;
alter table target_t logging;
alter index target_t_x01 logging;

파티션 테이블일 때

img
alter table target_t modify partition p_201712 nologging;
alter index target_t_x01 modify partition p_201712 unusable;
insert /*+ append */ into target_t
select * from source_t where dt between '20171201' and '20171231';
alter index target_t_x01 rebuild partition p_201712 nologging;
alter table target_t modify partition p_201712 logging;
alter index target_t_x01 modify partition p_201712 logging;