Site icon DBA의 정석

Invisible Index

  1. Invisible Index

  1. Invisible Index Test

• Tablespace 생성 및 User 생성

SQL> CREATE TABLESPACE TEST DATAFILE ‘/oracle11/app/oracle/oradata/ORA11/test01.dbf’ SIZE 10M;

SQL> CREATE USER TEST IDENTIFIED BY TEST DEFAULT TABLESPACE TEST;

SQL> GRANT CONNECT, RESOURCE TO TEST;

• Test Table 생성 및 통계정보 수집

SQL> CREATE TABLE Invisible_index (id NUMBER);

SQL> BEGIN

FOR i IN 1 .. 10000 LOOP

INSERT INTO invisible_index VALUES (i);

END LOOP;

COMMIT;

END;

/

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, ‘Invisible_index’, CASCADE=>TRUE); 

• PLAN 확인

SQL> SET SERVEROUTPUT ON;

SQL> SET AUTOTRACE TRACEONLY EXP;

SQL> SELECT * FROM Invisible_index WHERE id = 9999;

• ID에 Invisible Index 추가

SQL> CREATE INDEX invisible_id ON invisible_index(id) INVISIBLE;

• PLAN 확인

SQL> SET SERVEROUTPUT ON;

SQL> SET AUTOTRACE TRACEONLY EXP;

SQL> SELECT * FROM Invisible_index WHERE id = 9999;


è Invisible 상태이기 때문에 옵티마이저가 Index를 볼 수가 없어서 Full Table Scan을 함.

• Invisible Index를 사용하도록 Parameter 설정

SQL> ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES=TRUE;

• Parameter 설정 후 PLAN확인

SQL> SET SERVEROUTPUT ON;

SQL> SET AUTOTRACE TRACEONLY EXP;

SQL> SELECT * FROM Invisible_index WHERE id = 9999;


è Parameter 설정 후 PLAN을 확인해 보면 Index range scan을 한 것을 확인할 수 있음.

• user_indexes View 조회

SQL> SET AUTOTRACE OFF;

SQL> SELECT index_name, visibility FROM user_indexes;

è
Virtual Index와는 달리 Invisible Index는 실제 Segment가 할당이 되기 때문에 user_indexes View에서 확인이 가능하고 Invisible 상태인지 visible 상태인지 확인도 가능하다.

• Invisible Index를 Optimizer가 볼 수 있도록 visible 상태로 변경

SQL> ALTER INDEX Invisible_index visible;

• Index 상태 확인

SQL> SELECT index_name, visibility FROM user_indexes;


è Index의 상태가 VISIBLE인 것을 확인할 수 있음.

Exit mobile version