1 可见性
索引的可见性(visibility)指的是该索引是否对CBO优化器可见,即CBO优化器在生成执行计划的时候是否考虑该索引,可以看作是索引的一个属性。如果一个索引可见性属性为:invisible. 默认情况下CBO优化器生成执行计划的时候,不再考虑该索引,仅此而已。与可见索引一样,执行DML操作时,数据库会相应维护索引的数据。但是对于local 索引,我们不能单独为某个分区 设置不可见属性,只能对整个索引设置不可见属性。
- 设置索引可见性 不可见属性,可以在创建索引时指定,也可以后期调整。
-- 创建索引时指定不可见属性
create index index_name on table_name(column_list) invisible;
-- 后期调整可见性
alter index index_name invisible;
alter index index_name visible; - 相关参数 optimizer_use_invisible_indexes 此参数可以控制优化器生成执行计划时,是否考虑使用invisible index. 参数值为bool类型,当设置为true时,CBO会考虑使用invisible index. 默认为false. 此参数可以在会话或者系统全局或者实例级别进行设置。
SQL> select isses_modifiable,issys_modifiable,isinstance_modifiable from v$parameter where name='optimizer_use_invisible_indexes' ISSES ISSYS_MOD ISINS
----- --------- -----
TRUE IMMEDIATE TRUE
alter session set optimizer_use_invisible_indexes=true;
alter system set optimizer_use_invisible_indexes=true sid='*' scope=both; - 作用 在进行SQL优化时,不明确一个索引的创建或者删除对系统是否有影响,此时,我们可以先将索引设置为inbisible状态,然后,进行测试观察,如果与预期一致,再将索引设置主visible,或者删除。 不可见索引,是对于我们预期的一种难途径。
2 可用性
索引可用性(usable),正常情况下,索引都是可用的。当索引不可用(unusable)时, Oracle 内部会把该索引元数据(即创建语句包含的基本信息)与真实物理数据之间的对应关系撕裂,相关数据块可被重用。索引段是否已创建 (dba_indexes.segment_created)这一属性,会变为no(正常情况下,应为yes). unusable索引,想要被重新使用,只有一种方法: rebuild. 当然还可以先drop 再create.
- 一般情况下,CBO不考虑使用unusable状态的索引,包含分区表。
- 当索引不可用时,Oracle 清除索引数据,并且不再维护
- 本地索引中,可以设置某个分区的索引为unusable。
- 相关参数 skip_unusable_indexes
参数作用 控制对unusable 的非唯一索引,dml操作时是否维护索引数据 参数值 true | false 当参数设置为true时(默认),oracle对索引数据的维护及CBO优化器都不会考虑该索引。 当参数设置为false时,DML操作及CBO生成执行计划时都会考虑该索引。一旦与unusable索引相关的操作都会失败。会话报错退出。
- note
- 如果是唯一索引,DML时,oracle都会去校验索引可用性,如果索引不可用,就不能保证数据唯一性。