Oracle 파 티 션 색인 소개 와 인 스 턴 스 데모

파 티 션 색인(또는 색인 파 티 션)은 주로 파 티 션 시트 에 대한 것 입 니 다.데이터 양 이 계속 증가 함 에 따라 일반적인 쌓 인 표 는 파 티 션 표 로 전환 해 야 하고 색인 은 파 티 션 색인 으로 전환 해 야 합 니 다.파 티 션 색인 의 장점 은 분명 하 다.하나의 색인 을 여러 세 션 으로 나 누 어 필요 한 데 이 터 를 가 져 올 때 더 작은 색인 세 션(블록)에 접근 하면 이 루어 집 니 다.동시에 구역 을 서로 다른 표 공간 에 두 면 구역 의 가용성 과 신뢰성 을 높 일 수 있다.본 고 는 주로 파 티 션 색인 과 관련 된 특성 을 묘사 하고 예제 를 제시 했다.
1.파 티 션 색인 에 관 한 개념
a.파 티 션 색인 의 몇 가지 방식:표 는 파 티 션 되 어 있 지만 색인 은 파 티 션 되 지 않 습 니 다.표 는 파 티 션 되 지 않 았 고 색인 은 파 티 션 되 었 습 니 다.표 와 색인 이 모두 구분 되 어 있다.
b.파 티 션 색인 은 로 컬 파 티 션 색인 과 전체 파 티 션 색인 으로 나 눌 수 있 습 니 다.
로 컬 파 티 션 인덱스:
   로 컬 파 티 션 색인 정보의 저장 은 부모 표 파 티 션 에 의존 합 니 다.즉,로 컬 색인 은 파 티 션 시트 를 기반 으로 만 들 어 졌 을 것 이다.
   부족 한 경우 로 컬 색인 을 만 들 때 색인 저장 표 공간 이 지정 되 지 않 으 면 로 컬 색인 을 데이터 가 있 는 파 티 션 정의 표 공간 에 자동 으로 저장 합 니 다.
   로 컬 색인 의 파 티 션 메커니즘 은 표 의 파 티 션 메커니즘 과 마찬가지 로 로 로 컬 색인 은 B 트 리 색인 이나 비트 맵 색인 일 수 있 습 니 다.
   로 컬 색인 은 하나의 파 티 션 에 대한 것 으로 각 파 티 션 색인 은 하나의 표 파 티 션 만 가리 키 며 대등한 파 티 션 입 니 다.
   로 컬 색인 은 파 티 션 의 독립 성 을 지원 하기 때문에 이러한 단독 파 티 션 의 증가,캡 처,삭제,분할,오프라인 등 처 리 를 동시에 삭제 하거나 재 구축 할 필요 가 없습니다.
   로 컬 인덱스 는 데이터 창고 환경 에 많이 사 용 됩 니 다.
     
전역 파 티 션 인덱스:
   전역 섹 션 인덱스 는 섹 션 테이블 과 전역 인덱스 의 섹 션 메커니즘 이 다 르 기 때문에 만 들 때 섹 션 키 의 범위 와 값 을 정의 해 야 합 니 다.
   전역 섹 션 인덱스 를 만 들 때 글로벌 키 워드 를 지정 해 야 하 며 전역 섹 션 인덱스 는 B 트 리 인덱스 만 지정 할 수 있 습 니 다.
   전역 인덱스 는 구역 을 나 눌 수도 있 고,구역 을 나 누 지 않 을 수도 있 습 니 다.전역 인덱스 는 접두사 인덱스 여야 합 니 다.즉,인덱스 열 은 구역 키 를 포함해 야 합 니 다.
   전역 색인 파 티 션 에서 하나의 파 티 션 색인 은 n 개의 표 파 티 션 을 가리 키 는 동시에 하나의 표 파 티 션 도 n 개의 색인 파 티 션 을 가리 킬 수 있 습 니 다.
   기본 적 인 상황 에서 전역 색인 은 파 티 션 증가,캡 처,삭제,분할 등 을 재 구축 하거나 수정 해 야 할 때 update global indexs 를 지정 합 니 다.
   전역 파 티 션 인덱스 는 범위 나 해시 해시 파 티 션 에 만 있 습 니 다.
   전역 파 티 션 인덱스 는 oltp 시스템 에 많이 사 용 됩 니 다.
 
c.접두사 인덱스 와 접두사 인덱스 없 음
로 컬 과 전역 파 티 션 색인 은 접두사 색인 과 접두사 없 는 색인 두 가지 로 나 뉜 다.
접두사 와 비 접두사 색인 은 색인 파 티 션 제 거 를 지원 할 수 있 습 니 다.전 제 는 검색 조건 에 색인 파 티 션 키 를 포함 하 는 것 입 니 다.
접두사 인덱스 있 음:
   접두사 색인 은 파 티 션 키,즉 파 티 션 키 열 이 색인 에 포함 되 어 있 습 니 다.
   접두사 인덱스 는 로 컬 인덱스 와 전역 인덱스 를 지원 합 니 다.
접두사 인덱스 없 음:
   접두사 색인 이 없 으 면 파 티 션 키 의 선도 열 을 색인 의 선도 열 로 하지 않 습 니 다.
   접두사 인덱스 없 이 로 컬 섹 션 인덱스 만 지원 합 니 다.  
2.로 컬 파 티 션 인덱스 데모

--
SQL> select * from v$version where rownum<2;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi

SQL> create user leshami identified by xxx;

SQL> grant dba to leshami;

--
SQL> create tablespace tbs_tmp datafile '/u02/database/SYBO2/oradata/tbs_tmp.dbf' size 10m autoextend on;

SQL> alter user leshami default tablespace tbs_tmp;

SQL> create tablespace tbs1 datafile '/u02/database/SYBO2/oradata/tbs1.dbf' size 10m autoextend on;

SQL> create tablespace tbs2 datafile '/u02/database/SYBO2/oradata/tbs2.dbf' size 10m autoextend on;

SQL> create tablespace tbs3 datafile '/u02/database/SYBO2/oradata/tbs3.dbf' size 10m autoextend on;

SQL> create tablespace idx1 datafile '/u02/database/SYBO2/oradata/idx1.dbf' size 10m autoextend on;

SQL> create tablespace idx2 datafile '/u02/database/SYBO2/oradata/idx2.dbf' size 10m autoextend on;

SQL> create tablespace idx3 datafile '/u02/database/SYBO2/oradata/idx3.dbf' size 10m autoextend on;

SQL> conn leshami/xxx

-- lookup
CREATE TABLE lookup (
  id            NUMBER(10),
  description   VARCHAR2(50)
);

--
ALTER TABLE lookup ADD (
  CONSTRAINT lookup_pk PRIMARY KEY (id)
);

--
INSERT INTO lookup (id, description) VALUES (1, 'ONE');
INSERT INTO lookup (id, description) VALUES (2, 'TWO');
INSERT INTO lookup (id, description) VALUES (3, 'THREE');
COMMIT;

CREATE TABLE big_table (
  id            NUMBER(10),
  created_date  DATE,
  lookup_id     NUMBER(10),
  data          VARCHAR2(50)
)
PARTITION BY RANGE (created_date)
(PARTITION big_table_2012 VALUES LESS THAN (TO_DATE('01/01/2013', 'DD/MM/YYYY')) tablespace tbs1,
 PARTITION big_table_2013 VALUES LESS THAN (TO_DATE('01/01/2014', 'DD/MM/YYYY')) tablespace tbs2,
 PARTITION big_table_2014 VALUES LESS THAN (MAXVALUE)tablespace tbs3 ) ;
 
--
DECLARE
  l_lookup_id    lookup.id%TYPE;
  l_create_date  DATE;
BEGIN
  FOR i IN 1 .. 10000 LOOP
    IF MOD(i, 3) = 0 THEN
      l_create_date := ADD_MONTHS(SYSDATE, -24);
      l_lookup_id   := 2;
    ELSIF MOD(i, 2) = 0 THEN
      l_create_date := ADD_MONTHS(SYSDATE, -12);
      l_lookup_id   := 1;
    ELSE
      l_create_date := SYSDATE;
      l_lookup_id   := 3;
    END IF;
   
    INSERT INTO big_table (id, created_date, lookup_id, data)
    VALUES (i, l_create_date, l_lookup_id, 'This is some data for ' || i);
  END LOOP;
  COMMIT;
END;
/

--
SQL> CREATE INDEX bita_created_date_i ON big_table(created_date) LOCAL;

Index created.

SQL> select index_name, partitioning_type, partition_count from user_part_indexes;

INDEX_NAME                     PARTITI PARTITION_COUNT
------------------------------ ------- ---------------
BITA_CREATED_DATE_I            RANGE                 3

--Author : Leshami

-- ,
SQL> select partition_name, high_value, tablespace_name from user_ind_partitions;

PARTITION_NAME                 HIGH_VALUE                               TABLESPACE_NAME
------------------------------ ---------------------------------------- ------------------------------
BIG_TABLE_2014                 MAXVALUE                                 TBS3
BIG_TABLE_2013                 TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-M TBS2
                               M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

BIG_TABLE_2012                 TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-M TBS1
                               M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

--
SQL> drop index bita_created_date_i;

--
SQL> CREATE INDEX bita_created_date_i
  2     ON big_table (created_date)
  3     LOCAL (
  4        PARTITION idx_2012 TABLESPACE idx1,
  5        PARTITION idx_2013 TABLESPACE idx2,
  6        PARTITION idx_2014 TABLESPACE idx3)
  7     PARALLEL 3;

Index created.

SQL> select partition_name, high_value, tablespace_name from user_ind_partitions;

PARTITION_NAME                 HIGH_VALUE                               TABLESPACE_NAME
------------------------------ ---------------------------------------- ------------------------------
IDX_2014                       MAXVALUE                                 IDX3
IDX_2013                       TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-M IDX2
                               M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

IDX_2012                       TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-M IDX1
                               M-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA

SQL> select * from big_table where rownum<2;

        ID CREATED_  LOOKUP_ID DATA
---------- -------- ---------- --------------------------------------------------
      1413 20120625          2 This is some data for 1413

-- local index , , ,      
SQL> set autot trace exp;
SQL> select * from big_table where created_date=to_date('20120625','yyyymmdd');

Execution Plan
----------------------------------------------------------
Plan hash value: 2556877094

--------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name                | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                     |     1 |    41 |     2   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE SINGLE            |                     |     1 |    41 |     2   (0)| 00:00:01 |     1 |     1 |
|   2 |   TABLE ACCESS BY LOCAL INDEX ROWID| BIG_TABLE           |     1 |    41 |     2   (0)| 00:00:01 |     1 |     1 |
|*  3 |    INDEX RANGE SCAN                | BITA_CREATED_DATE_I |     1 |       |     1   (0)| 00:00:01 |     1 |     1 |
--------------------------------------------------------------------------------------------------------------------------

3.전역 파 티 션 인덱스 데모

--
SQL> ALTER TABLE big_table ADD (
  2    CONSTRAINT big_table_pk PRIMARY KEY (id)
  3  );

Table altered.      

SQL> select index_name,index_type,tablespace_name,global_stats,partitioned
  2  from user_indexes where index_name='BIG_TABLE_PK';

INDEX_NAME                     INDEX_TYPE                  TABLESPACE_NAME                GLO PAR
------------------------------ --------------------------- ------------------------------ --- ---
BIG_TABLE_PK                   NORMAL                      TBS_TMP                        YES NO

SQL> set autot trace exp;                                                                                         
SQL> select * from big_table where id=1412;                                                                       
                                                                                                                  
Execution Plan                                                                                                    
----------------------------------------------------------                                                        
Plan hash value: 2662411593                                                                                       
                                                                                                                  
-------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name         | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |              |     1 |    62 |     2   (0)| 00:00:01 |       |       |
|   1 |  TABLE ACCESS BY GLOBAL INDEX ROWID| BIG_TABLE    |     1 |    62 |     2   (0)| 00:00:01 | ROWID | ROWID |
|*  2 |   INDEX UNIQUE SCAN                | BIG_TABLE_PK |     1 |       |     1   (0)| 00:00:01 |       |       |
-------------------------------------------------------------------------------------------------------------------
-- , ,Pstart Pstop ROWID
-- GLOBAL INDEX ROWID, Global,
-- , ,

SQL> drop index bita_created_date_i;

-- ,
SQL> CREATE INDEX bita_created_date_i
   ON big_table (created_date)
   GLOBAL PARTITION BY RANGE (created_date)
      (
         PARTITION
            idx_1 VALUES LESS THAN (TO_DATE ('01/01/2013', 'DD/MM/YYYY'))
            TABLESPACE idx1,
         PARTITION
            idx_2 VALUES LESS THAN (TO_DATE ('01/01/2014', 'DD/MM/YYYY'))
            TABLESPACE idx2,
         PARTITION idx_3 VALUES LESS THAN (maxvalue) TABLESPACE idx3);

SQL> select index_name, partitioning_type, partition_count,locality from user_part_indexes;

INDEX_NAME                     PARTITI PARTITION_COUNT LOCALI
------------------------------ ------- --------------- ------
BITA_CREATED_DATE_I_G          RANGE                 3 GLOBAL

SQL> select partition_name, high_value, tablespace_name from user_ind_partitions;

PARTITION_NAME                 HIGH_VALUE             TABLESPACE_NAME
------------------------------ --------------------- ------------------------------
IDX_1                          TO_DATE(' 2013-01-01  IDX1
IDX_2                          TO_DATE(' 2014-01-01  IDX2
IDX_3                          MAXVALUE              IDX3 

-- ,
SQL> set autot trace exp;
SQL> select * from big_table where created_date=to_date('20130625','yyyymmdd');

Execution Plan
----------------------------------------------------------
Plan hash value: 1378264218

---------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name                | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                     |     1 |    41 |     2   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE SINGLE             |                     |     1 |    41 |     2   (0)| 00:00:01 |     2 |     2 |
|   2 |   TABLE ACCESS BY GLOBAL INDEX ROWID| BIG_TABLE           |     1 |    41 |     2   (0)| 00:00:01 |     2 |     2 |
|*  3 |    INDEX RANGE SCAN                 | BITA_CREATED_DATE_I |     1 |       |     1   (0)| 00:00:01 |     2 |     2 |
---------------------------------------------------------------------------------------------------------------------------

-- ,Pstart 1,Pstop 2,
SQL> select * from big_table                                                              
  2  where created_date>=to_date('20120625','yyyymmdd') and created_date<=to_date('20130625','yyyymmdd');

Execution Plan
----------------------------------------------------------
Plan hash value: 213633793

------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name      | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |           |  3334 |   133K|    14   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ITERATOR|           |  3334 |   133K|    14   (0)| 00:00:01 |     1 |     2 |
|*  2 |   TABLE ACCESS FULL      | BIG_TABLE |  3334 |   133K|    14   (0)| 00:00:01 |     1 |     2 |
------------------------------------------------------------------------------------------------------

좋은 웹페이지 즐겨찾기