메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

글로벌 인덱스 관리

DB CAFE

파티션 테이블 글로벌 인덱스 관리

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

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.

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를 바로 리빌드 하지 않으면 야간 오라클 스케줄러에 의해 자동 리빌드 됨(락 발생되지 않음)