"글로벌 인덱스 관리"의 두 판 사이의 차이
DB CAFE
(→파티션 태이블 글로벌 인덱스 관리) |
(→update global indexes 테스트) |
||
6번째 줄: | 6번째 줄: | ||
# 19C '''update global indexes''' 옵션 추가되어 unusable index문제 해결 (12C는 확인 ?) | # 19C '''update global indexes''' 옵션 추가되어 unusable index문제 해결 (12C는 확인 ?) | ||
− | === | + | === global indexes unusable 테스트 === |
* global index unusable 로 되는경우 테스트 | * global index unusable 로 되는경우 테스트 | ||
<source lang=sql> | <source lang=sql> | ||
42번째 줄: | 42번째 줄: | ||
Table altered. | Table altered. | ||
-- 파티션 테이블 구조를 변경했기 때문이 로컬 인덱스는 변경 사항없고 글로벌 인덱스는 UNUSABLE 됨. | -- 파티션 테이블 구조를 변경했기 때문이 로컬 인덱스는 변경 사항없고 글로벌 인덱스는 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. | ||
+ | </source> | ||
+ | |||
+ | === update global indexes 테스트 === | ||
+ | * update global indexes 옵션추가 하여 global index usable 유지토록 테스트 | ||
+ | <source lang=sql> | ||
+ | -- 테이블 삭제 | ||
+ | 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> | SQL> | ||
SQL> select index_name, partition_name, status | SQL> select index_name, partition_name, status |
2023년 1월 19일 (목) 16:21 판
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
1 파티션 태이블 글로벌 인덱스 관리[편집]
- 인덱스는 기본적으로 열의 키(값)를 테이블의 해당 행의 물리적 위치에 매핑하는 구조
- 따라서 행을 이동 하는 경우(즉, 행의 물리적 위치 변경) 해당 행의 인덱스 항목을 업데이트해야 함
- 그렇지 않으면 인덱스를 더 이상 사용할 수 없습니다.
- 파티션 테이블에 로컬 인덱스 와 글로벌 인덱스를 모두 있는 경우 alter table 명령 으로 파티션을 추가 하거나 삭제시 글로벌 인덱스는 invalid 로 되어 unusable 상태가 됨(즉 사용할수 없는 상태가 됨)
- 19C update global indexes 옵션 추가되어 unusable index문제 해결 (12C는 확인 ?)
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>
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.