행위

글로벌 인덱스 관리

DB CAFE

thumb_up 추천메뉴 바로가기


1 파티션 테이블 글로벌 인덱스 관리[편집]

  1. 인덱스는 기본적으로 열의 키(값)를 테이블의 해당 행의 물리적 위치에 매핑하는 구조
  2. 따라서 행을 이동 하는 경우(즉, 행의 물리적 위치 변경) 해당 행의 인덱스 항목을 업데이트해야 함
  3. 그렇지 않으면 인덱스를 더 이상 사용할 수 없습니다.
  4. 파티션 테이블에 로컬 인덱스 와 글로벌 인덱스를 모두 있는 경우 alter table 명령 으로 파티션을 추가 하거나 삭제시 글로벌 인덱스는 invalid 로 되어 unusable 상태가 됨(즉 사용할수 없는 상태가 됨)
  5. 12C update global indexes 옵션 추가되어 unusable index문제 해결

1.1 global indexes unusable 테스트[편집]

  • global index unusable 로 되는경우 테스트
-- 파티션 테이블 생성
SQL> create table t (x int, y int, z int )
  2  partition by range (x)
  3  (
  4    partition p1 values less than (4000),
  5    partition p2 values less than (8000)
  6  );

Table created.

-- 데이터 입력
SQL> insert into t 
select q*1000,rownum,rownum 
  from dba_objects
    , ( select rownum q 
          from dual 
       connect by level < 8);
SQL> commit;
Commit complete.

-- 로컬 인덱스 생성
SQL> create index ix_local on t ( y ) local;
Index created.

-- 글로벌 인덱스 생성
SQL> create index ix_global on t ( z ) ;
Index created.

-- alter 명령으로 파티션 테이블 구성을 변경(p2a ,p2b  파티션을 추가하여 글로벌 인덱스가 unusable 되는지 확인)
SQL> alter table t split partition p2 at (6000)
  2    into ( partition p2a, partition p2b ) ;
Table altered.
-- 파티션 테이블 구조를 변경했기 때문이 로컬 인덱스는 변경 사항없고 글로벌 인덱스는 UNUSABLE 됨.
SQL>
SQL> select index_name, partition_name, status
  2  from user_ind_partitions
  3  where index_name like 'IX%';

INDEX_NAME                     PARTITION_NAME       STATUS
------------------------------ -------------------- --------
IX_LOCAL                       P1                   USABLE
IX_LOCAL                       P2A                  UNUSABLE
IX_LOCAL                       P2B                  UNUSABLE

3 rows selected.

SQL>
SQL> select index_name, status
  2  from user_indexes
  3  where index_name like 'IX%';

INDEX_NAME                     STATUS
------------------------------ --------
IX_GLOBAL                      UNUSABLE
IX_LOCAL                       N/A

2 rows selected.

1.2 update global indexes 테스트[편집]

  • update global indexes 옵션추가 하여 global index usable 유지토록 테스트
-- 테이블 삭제
drop table t purge;
-- 파티션 테이블 생성
SQL> create table t (x int, y int, z int )
  2  partition by range (x)
  3  (
  4    partition p1 values less than (4000),
  5    partition p2 values less than (8000)
  6  );

Table created.

-- 데이터 입력
SQL> insert into t 
select q*1000,rownum,rownum 
  from dba_objects
    , ( select rownum q 
          from dual 
       connect by level < 8);
SQL> commit;
Commit complete.

-- 로컬 인덱스 생성
SQL> create index ix_local on t ( y ) local;
Index created.

-- 글로벌 인덱스 생성
SQL> create index ix_global on t ( z ) ;
Index created.

-- update global indexes 옵션을 추가하여
-- alter 명령으로 파티션 테이블 구성을 변경(p2a ,p2b  파티션을 추가하고  글로벌 인덱스가 usable 상태를 유지하는지  확인)
SQL> alter table t split partition p2 at (6000)
  2    into ( partition p2a, partition p2b ) 
update global indexes; -- 옵션추가 
Table altered.

-- 글로벌 인덱스 상태 확인.
SQL> select index_name, partition_name, status
  2  from user_ind_partitions
  3  where index_name like 'IX%';

INDEX_NAME                     PARTITION_NAME       STATUS
------------------------------ -------------------- --------
IX_LOCAL                       P1                   USABLE
IX_LOCAL                       P2A                  UNUSABLE
IX_LOCAL                       P2B                  UNUSABLE

3 rows selected.

SQL>
SQL> select index_name, status
  2  from user_indexes
  3  where index_name like 'IX%';

INDEX_NAME                     STATUS
------------------------------ --------
IX_GLOBAL                      VALID
IX_LOCAL                       N/A

2 rows selected.
-- 와우~ 대박
  • global index를 바로 리빌드 하지 않으면 야간 오라클 스케줄러에 의해 자동 리빌드 됨(락 발생되지 않음)