파티션 테이블 글로벌 인덱스 관리
- 인덱스는 기본적으로 열의 키(값)를 테이블의 해당 행의 물리적 위치에 매핑하는 구조
- 따라서 행을 이동 하는 경우(즉, 행의 물리적 위치 변경) 해당 행의 인덱스 항목을 업데이트해야 함
- 그렇지 않으면 인덱스를 더 이상 사용할 수 없습니다.
- 파티션 테이블에 로컬 인덱스 와 글로벌 인덱스를 모두 있는 경우 alter table 명령 으로 파티션을 추가 하거나 삭제시 글로벌 인덱스는 invalid 로 되어 unusable 상태가 됨(즉 사용할수 없는 상태가 됨)
- 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를 바로 리빌드 하지 않으면 야간 오라클 스케줄러에 의해 자동 리빌드 됨(락 발생되지 않음)