Invisible Index Oracle 11g

You can invisible an index instead of dropping for your any kind of test and make it visible when you need it in Oracle 11g. When you make any index invisible the query optimizer will disregard the index. You can make the index know to optimizer in two ways:

1.      Set initialization parameter optimizer_use_invisible_indexes to trues. When this parameter is true the optimizer treat the entire invisible index as normal index.

2.      If you want to make any particular index known to the optimizer then you need to user oracle hint.

 

Example: How to Invisible an index and make it visible again

SQL> desc emp;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)



SQL> explain plan for select * from scott.emp where deptno=20;

Explained.

SQL> select * from TABLE(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     5 |   190 |     3   (0)| 00:00:01 |
|*  1TABLE ACCESS FULL| EMP  |     5 |   190 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

   1 - filter("DEPTNO"=20)

13 rows selected.


SQL> create index idx_dept on emp(deptno);

Index created.

SQL> explain plan for select * from scott.emp where deptno=20;

Explained.


SQL> select * from TABLE(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1877191900

----------------------------------------------------------------------------------------
| Id  | Operation                   | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |          |     5 |   190 |     2   (0)| 00:00:01 |
|   1TABLE ACCESS BY INDEX ROWID| EMP      |     5 |   190 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_DEPT |     5 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------


   2 - access("DEPTNO"=20)

14 rows selected.

-- as sys user
SQL> select index_name, visibility from dba_indexes where index_name='IDX_DEPT'

INDEX_NAME                                     VISIBILITY
----------------------------------------------------------------------------------

IDX_DEPT                                        VISIBLE


SQL> alter index idx_dept invisible;

Index altered.

-- as sys user
SQL> select index_name, visibility from dba_indexes where index_name='IDX_DEPT';
INDEX_NAME                                       VISIBILITY
----------------------------------------------------------------------------------

IDX_DEPT                                         INVISIBLE


SQL> explain plan for select * from scott.emp where deptno=20;

Explained.


SQL> select * from TABLE(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     5 |   190 |     3   (0)| 00:00:01 |
|*  1TABLE ACCESS FULL| EMP  |     5 |   190 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------
   1 - filter("DEPTNO"=20)

13 rows selected.

To make the index visible again use the command:

SQL> alter index idx_dept visible;

Index altered.

-- as sys user
SQL> select index_name, visibility from dba_indexes where index_name='IDX_DEPT'

INDEX_NAME                                     VISIBILITY
----------------------------------------------------------------------------------

IDX_DEPT                                        VISIBLE



You can use hint to make this index known to the optimizer.

SQL> select /*+ index(idx_dept) */ * from scott.emp where deptno=20;

Explained.

You can set optimizer_use_invisible_indexes parameter true to make all the invisible index known to the optimizer. This is a dynamic parameter.

SQL> alter system set optimizer_use_invisible_indexes=true;

Comments