Database초보우낙

7.파티션중 하나의 파티션에만 인덱스 생성 가능 본문

oracle 12c

7.파티션중 하나의 파티션에만 인덱스 생성 가능

오운학 2024. 4. 30. 09:49

▩ 예제7. 파티션중 하나의 파티션에만 인덱스 생성 가능

* 테이블의 종류  5가지?

 1. 일반 테이블(heap table) : 열과 행의 구조로 데이터를 저장하는 기본 저장소
 
 2. 파티션 테이블(partition  table) : 데이터가 아주 커서 데이터의 종류별로
                                              별도의 파티션에 저장하는 테이블

      2.1 global  partition  index
      2.2 local  partition  index 
      2.3 특정 파티션 한개에만 인덱스를 생성할 수 있음
       
 3. 클러스터 테이블(cluster  table) : 비슷한 데이터들을 물리적으로 같은 디스크에
                                              저장하겠금 구성한 테이블

 4. IOT table ( index  organization  table ):  인덱스 구조의 테이블.
                                                          인덱스와 테이블을 합쳐서 검색 속도를
                                                          높이겠금 디자인된 테이블

 5. 외부 테이블(external  table) :  데이터베이스에 데이터가 저장되어 있지 않고
                                            os에 저장되어있는 테이블

■ 파티션 테이블의 종류 4가지 ?

( 면접문제 ) 파티션 테이블의 종류에 대해서 아시는데로 설명해보세요.

1. range 파티션 테이블
2. hash 파티션 테이블
3. list  파티션 테이블
4. 복합 파티션 테이블 :   1. range + hash 파티셔닝
                                 2. range + list  파티션닝
                                 3. range + range 파티션닝
                                 4. list + hash 파티셔닝
                                 5. list + list 파티셔닝
                                 6. list + range 파티셔닝 

■ 실습:  (https://cafe.daum.net/oracleoracle/SoYx/51)

▣ 예제1. emp 테이블의 월급을 파티션 키 컬럼으로 해서 파티션 테이블을 생성하시오

 create  table   emp_partition3
   ( empno number(4,0) , 
    ename varchar2(10), 
    job varchar2(9), 
    mgr number(4,0), 
     hiredate date, 
    sal number(7,2), 
    comm number(7,2), 
    deptno number(2,0)
   )  
      partition by  range(sal)
   (   partition   p1_sal   values   less  than( 1000 ),
       partition   p2_sal   values   less  than( 2000 ),
       partition   p3_sal   values   less  than( 3000 ),
       partition   p4_sal   values   less  than( 4000 ),
       partition   p5_sal   values   less  than( 5000 ),
       partition   p6_sal   values   less  than( maxvalue )   );

 insert  into  emp_partition3
 select  *
   from emp;

▣ 예제2. 파티션별로 데이터가 잘 골고루 분배되었는지 확인하시오 !

#1. emp_partition3 테이블의 통계정보를 수집합니다.

 exec  dbms_stats.gather_table_stats('scott', 'emp_partition3');

#2. 데이터 딕셔너리를 조회

  select   table_name, partition_name, num_rows
     from  user_tab_partitions
    where  table_name='EMP_PARTITION3';

▣ 예제3.  emp_partition3 파티션 테이블에 파티션 인덱스를 생성하시오 !

 * 파티션 인덱스 2가지?

  1. 로컬 파티션 인덱스 :  테이블의 파티션의 갯수와 인덱스의 파티션의 갯수가 서로 일치
                                  (현업에서 많이 사용)

 예: create   index  emp_partition3_local_indx
       on   emp_partition3(sal)  local;
   
  2. 글로벌 파티션 인덱스: 테이블의 파티션의 갯수와 인덱스의 파티션의 갯수가 서로 불일치

 예: drop   index  emp_partition3_local_indx;

     create  index  emp_partition3_global
        on  emp_partition3(sal)  global
        partition  by  hash(sal)  partitions  2;

   테이블의 파티션의 갯수는 6개인데 인덱스 파티션의 갯수는 2개입니다. 

▣ 예제4.  12c 에 새로 나온 파티션 인덱스

  파티션중에 하나의 파티션에만 인덱스를 생성할 수 있게 했습니다.

 장점:   1. 저장 공간 아주 크게 절약됩니다. 
           2. 특정 파티션의 특정 범위의 데이터만 자주 조회를 하는 경우의 성능을 더 높일 수
              있습니다. 
          3.  인덱스가 필요없는 파티션에 대해서는 인덱스 유지 관리 작업이 불필요해지므로
              관리비용과 시간을 절약할 수 있습니다. 


-- 먼저, 파티션 절을 추가합니다 (테이블을 재생성해야 파티셔닝할 수 있습니다)

drop  table  emp_part;

CREATE TABLE emp_part
(EMPNO NUMBER(4) NOT NULL, 
ENAME VARCHAR2(10),
deptno  number(10))
PARTITION BY RANGE (deptno) (
    PARTITION p1 VALUES LESS THAN (20),
    PARTITION p2 VALUES LESS THAN (40)
);

-- 그 다음, 파티션 중 하나에만 적용되는 부분 인덱스를 생성합니다:
CREATE INDEX emp_part_idx ON emp_part(empno) LOCAL (
    PARTITION p1,
    PARTITION p2 UNUSABLE
);