就这么简单。显然,如果前面的SELECT语句只是查询EMP表,或许我们应该删除掉IX_EMP_SAL索引。
如果索引已经被使用,或将被使用,在采取行动(如删除或创建索引)之前,我们必须放聪明点。为了帮助解决这些问题,Oracle为我们提供了一个新特性,INVISIBLE索引,允许我们将索引隐藏起来,隐藏的索引不能使用,但仍然可以通过INSERT,UPDATE和DELETE进行维护。要使一个索引不可见,可以使用CREATE或ALTER INDEX INVISIBLE命令,这里以上面的IX_EMP_SAL索引为例进行演示:
>SQL> create index ix_emp_sal on emp(sal) INVISIBLE;
SQL> alter index ix_emp_sal INVISIBLE;
当一个索引被置为INVISIBLE时,应用程序就看不到它了,也不能在任何DML操作中使用它了。优化器也看不到隐藏索引,因此也不会被任何执行计划使用,除非明确指定了一个提示(hint),会话被设置为使用隐藏索引,或者数据库被设置为可以使用所有的隐藏索引,这正是某些DBA梦寐以求的功能,使用一个新的init.ora参数optimizer_use_invisible_indexes,你可以固定会话,或全系统范围内都可以使用隐藏索引,让你有机会测试新建索引在完全移动到生产环境之前的影响,可以通过设置这个初始化参数使用隐藏索引,或在SQL中增加提示使用隐藏索引,如:
>SQL> alter system set optimizer_use_invisible_indexetrue;
SQL> alter session set optimizer_use_invisible_indexetrue;
SQL> select * /*+ index (emp ix_ep_sal) */ ename from emp where sal=1500;
要使一个索引从不可见状态变为可见状态,使用ALTER INDEX语句+ VISIBLE关键字即可:
>SQL> alter index ix_emp_sal VISIBLE;