Oracle unusable index 与unvisible index

可见性

索引的可见性(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,或者删除。 不可见索引,是对于我们预期的一种难途径。

可用性

索引可用性(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都会去校验索引可用性,如果索引不可用,就不能保证数据唯一性。
posted @ 2017-11-22 11:03  halberd.lee  阅读(2978)  评论(0编辑  收藏  举报