오라클 성능 고도화 원리와 해법 II (2016년)
테이블 파티셔닝 0 0 4,452

by 구루비 파티셔닝 partition_table 파티션테이블 [2017.06.04]


h1.

01 테이블파티셔닝

  • 파티셔닝 (Partitioning)은 테이블과 인텍스 데이터를 파티션(Partition) 단위로 나누어 저장하는 것을 말한다.
  • 관리적 측면 : 파티션 단위 백업,추가,삭제 ,변경
  • 성능적 측면 : 파티션단위 조회 및 DML 수행

(1) 파티션 기본 구조

  • 파티션 테이블이 처음 제공되기 시작한 것은 오라클 버전 8부터다.
  • 그 이전 7.3 벼전에서는 파티션 뷰를 통해 파티션 기능을 구현했으며, 이를 '수동 파티셔닝 (manual partitioning)' 이라고 부른다.

h5.버전별 지원

파티션유형단일파티셔닝결합파티셔닝
해시리스트Range
Range8 이상8i 이상9i 이상11g 이상
해시8i 이상XXX
리스트9i 이상11g 이상11g 이상11g 이상
수동파티셔닝

-- 파티션 뷰를 정의할 때 시용할 Base 테이블을 만든다.
create table p1 as select * from scott.emp where deptno = 10;
create table p2 as select * from scott.emp where deptno = 20;
create table p3 as select * from scott.emp where deptno = 30;

--  체크 제약을 반드시 설정해야 함
alter table p1 add constraint c_deptno_10 check (deptno < 20);
alter table p2 add constraint c_deptno_20 check (deptno >= 20 AND deptno < 30) ;
alter table p3 add constraint c_deptno_30 check(deptno >= 30 AND deptno < 40) ;

create index p1_empno_idx on p1 (empno);
create index p2_empno_idx on p2 (empno);
create index p3_empno_idx on p3 (empno) ;

analyze table pl compute statistics;
analyze table p2 compute statistics;
analyze table p3 compute statistics;

-- 파티션 뷰를 정의한다.
create or replace view partition view
as
select * from pl
union a11
select * from p2
uhion a11
select * from p3 ;

파티션 테이블

create table partition table
partition by range(deptno) (
 partition p1 values less than(20)
,partition p2 values less than(30)
,partition p3 values less than(40)
as
select * from emp
create index ptable_empno_idx on partition_table(empno) LOCAL;


(2) Range 파티셔닝


create table 주문 ( 주문번호 nurnber, 주문일자 varchar2(8) , 고객 id varchar2 (5) , ... )
partition by range(주문일자) (
  partition p2009_q1 values less than ('20090401')
, partition p2009_q2 values less than ('20090701')
, partition p2009_q3 values less than ('20091001')
, partition p2009_q4 values less than ('20100101')
, partition p2010_q4 values less than ('20100401')
, partition p9999_mx values less than ( MAXVALUE ) -> 주문일자 >= ' 20100401 '
);


(3)해시 파티셔닝

create table 고객 ( 고객 id varchar2 (5), 고객명 varchar2 (10) , ....)
partition by hash(고객 id) partitions 4 ;

병렬쿼리성능향상
  • 데이터가모든파티션에 고르게 분산돼 있다면 더구나 각파티션이 서로 다른 디바이스에 저장(tablespace 분산)&nbsp;돼 있다면 병렬 I/O 성능을 극대화할 수 있다.
DML 경합분산
  • 동시 입력이 많은 대용량 테이블이나 인텍스에 발생하는 경합을 줄일 목적으로도 해시 파티셔닝을 사용
  • 데이터가 입력되는 테이블 블록에도 경합이 발생할 수 있지만 그보다는 입력할 블록을 할당받기 위한 Freelist 조회 때문에 세그먼트 헤더 블록에 대한 경합이 더 자주 발생될때 유용
  • Right Growing 인텍스(예를 들어, 순차적으로 증가하는 일련번호 컬럼에 인댁스를 생성하는 경우)도 자주 경합지점이 되곤하는데, 맨우측끝블록에만값이 입력되는특정 때문이다. 이때도인텍스를해시 파
    티셔닝함으로써 경합발생 가능성을 낮출수 있다
(4)리스트 파티셔닝
  • 오라클 9i 버전부터 제공되기 시작한 리스트 파티셔닝은 사용자에 의해 미리 정해진 그룹핑 기준에 따라 데이터를분할 저장하는 방식

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) -> 기타 지역
);

(5) 결합파티셔닝

  • 결합 파티져닝(Composite Partitioning)을 구성하면 서브파티션마다 세그먼트를 할당하고,서브 파티션 단위로 데이터를 저장한다. 즉, 주 파티션 커에 따라 1차적으로 데이터를 분배하고, 서브 파티션 키에 따라 최종적으로 저장할 위치(세그먼트)를 결정한다.
    http://www.gurubee.net/lecture/1912

h5.Range + 해시 결합 파티셔닝

  • 주문일자 기준으로 주문 테이블을 분기별 Range 파티셔닝하고, 그 안에서 다시 고객ID기준으로 해시 파티셔닝히는 방법을 예시하고 있다.

create table 주문 ( 주문변호 number, 주문일자 varchar2(8) , 고객id varchar2 (5) , ...)
partition by range(주문일자)
subpartition by hash(고객id) subpartitions 8
( partition p2009_q1 values less than( '20090401' )
, partition p2009_q2 values less than( '20090701' )
, partition p2009_q3 values less than( '20091001' )
, partition p2009_q4 values less than( '20100101' )
, partition p2010_q1 values less than( '20100401' )
, partition p9999_mx values less than( 'MAXVALUE) )

h5.Range + 리스트 결합파티셔닝


create tab1e 판매 ( 판매점 varchar2(10) , 판매일자 varchar2(8), ...)
partition by range( 판매일자)
subpartition by 1ist(판매점)
subpartition template
( subpartition lst_01 va1ues ('남지점'   ,'강북지점' . .강서지점' . '강동지점')
, subpartition lst_02 va1ues ('부산지점' , '대전지점')
, subpartition lst 03 va1ues ('인천지점' , '제주지점' , .의정부지점')
, subpartition lst_99 va1ues ( DEFAULT ) )
( partition p2009 q1 va1ues 1ess than( ' 20090401 ' )
, partition p2009 q2 va1ues 1ess than( ' 20090701 ' )
, partition p2009 q3 va1ues 1ess than( ' 20091001 ' )
, partition p2009 q4 va1ues 1ess than( ' 20100101 ' ) );

h5.기타결합파티셔닝

  • Range-Range
  • 리스트 해시
  • 리스트-리스트
  • 리스트-Range

h3.(6) 11g에 추가된 파티션 유형

h5.Reference 파티셔닝

  • 에서 부모 테이블 파티션 키를 이용해 자식 테이블을 파티셔닝하는 기능 (11g)

h5.Interval 파티셔닝

  • 11g부터는 Range 파티션을 생성할 때 아래와 같이 interval 기준을 정의함으로써 정해진 간격
    으로 파티션이 자동 추가

create table 주문일자 (주문변호 number, 주문일시 date, ... )
  partition by range(주문일시) INTERVAL (NUMTOYMINTERVAL ,(1, 'MONTH' ) 
(
, ....  
, partition p200908 values less than(to_date( '2009/09/01' , 'yyyy/mm/dd'))
, partition p200909 values less than(to_date( '2009/10/01' , 'yyyy/mm/dd'))
, partition p200910 values less than(to_date( '2009/11/01' , 'yyyy/mm/dd'))



create table 고객 (고객번호 number,고객명, VARCHAR2(20) , ... )
partition by range(고객번호)I INTERVAL (100000)
( partition p_cust1 values less than ( 100001 )
, partition p_cust2 values less than ( 200001 )
, partition p_cust3 values less than ( 300001 )


"구루비 주주클럽 스터디모임" 에서 2016년에 "오라클 성능 고도화 원리와 해법 II " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3378

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입