Oracle/Administration2012. 5. 2. 12:56

11.1 버전에 추가된 INVISIBLE 인덱스를 살펴보자.


테스트를 위해 아래와 같이 데이터를 생성하자. t1_x1은 INVISIBLE 인덱스다. *_INDEXES 뷰의 visibility 열이 INVISIBLE로 표시된다.

-- 1-1
DROP TABLE t1 PURGE;
CREATE TABLE t1 AS SELECT ROWNUM AS c1 FROM XMLTABLE ('1 to 1000');
CREATE INDEX t1_x1 ON t1 (c1) INVISIBLE;

-- 1-2
SELECT visibility FROM user_indexes WHERE index_name = 'T1_X1';

VISIBILITY
----------
INVISIBLE

1개의 행이 선택되었습니다.

INVISIBLE 인덱스는 optimizer_use_invisible_indexes 파라미터가 TURE인 경우에만 사용된다. 신규 인덱스 생성, 기존 인덱스 삭제의 영향도 파악 등에 활용할 수 있다.

-- 2-1
SELECT * FROM t1 WHERE c1 = 1;

----------------------------------
| Id  | Operation         | Name |
----------------------------------
|   0 | SELECT STATEMENT  |      |
|*  1 |  TABLE ACCESS FULL| T1   |
----------------------------------

-- 2-2
ALTER SESSION SET optimizer_use_invisible_indexes = TRUE;

SELECT * FROM t1 WHERE c1 = 1;

----------------------------------
| Id  | Operation        | Name  |
----------------------------------
|   0 | SELECT STATEMENT |       |
|*  1 |  INDEX RANGE SCAN| T1_X1 |
----------------------------------

INVISIBLE 인덱스를 사용하면 동일한 열에 다수의 인덱스를 생성할 수 있다. 예제 3-3을 응용하면 로그온 트리거를 통해 세션별로 사용할 인덱스를 지정할 수 있다.

-- 3-1
ALTER INDEX t1_x1 VISIBLE;

인덱스가 변경되었습니다.

CREATE BITMAP INDEX t1_x2 ON t1 (c1);

ORA-01408: 열 목록에는 이미 인덱스가 작성되어 있습니다

ALTER INDEX t1_x1 INVISIBLE;

인덱스가 변경되었습니다.

CREATE BITMAP INDEX t1_x2 ON t1 (c1);

인덱스가 생성되었습니다.

ALTER INDEX t1_x1 VISIBLE;

ORA-14147: 동일한 열 집합에 정의된 기존 VISIBLE 인덱스가 있습니다.

-- 3-2
ALTER SESSION SET optimizer_use_invisible_indexes = FALSE;

SELECT * FROM t1 WHERE c1 = 1;

---------------------------------------------
| Id  | Operation                   | Name  |
---------------------------------------------
|   0 | SELECT STATEMENT            |       |
|   1 |  BITMAP CONVERSION TO ROWIDS|       |
|*  2 |   BITMAP INDEX SINGLE VALUE | T1_X2 |
---------------------------------------------

-- 3-3
ALTER INDEX t1_x2 INVISIBLE;
ALTER INDEX t1_x1 VISIBLE;

SELECT * FROM t1 WHERE c1 = 1;

----------------------------------
| Id  | Operation        | Name  |
----------------------------------
|   0 | SELECT STATEMENT |       |
|*  1 |  INDEX RANGE SCAN| T1_X1 |
----------------------------------


'Oracle > Administration' 카테고리의 다른 글

CHECK 제약조건 적용 사례  (0) 2012.05.22
PK 제약조건과 인덱스 #1  (0) 2012.05.18
RANGE 파티션 통계정보 관리 패키지  (0) 2012.05.10
DDL TRIGGER 감사 기능  (0) 2012.05.01
READ ONLY 테이블 테스트  (0) 2012.05.01
Posted by 정희락_