unusable index and invisible index 的区别

    当你在批量加载数据的时候,想要改变性能或者测试删除索引后的性能,可以使用unusable index 或者是 invisible index

那么 unusable index 和invisible  index 有什么区别呢


unusable index

(1)unusable index 是被优化器所忽略,并且不被dml操作维护。但是unusable index 可以改变批量加载的性能

 (2) 任何现有的索引变成unusable后,索引段都会被删除

(3)由于unusable index 是不会被dml操作维护,索引变成unusable index后必须通过rebuild index 或者drop index  and create index

(4)当参数  SKIP_UNUSABLE_INDEXES =true时

    • dml操作时针对表的操作,对于索引是不会维护的。
    • 唯一约束使用的索引变成unusable,dml操作会报错。
    • 对于非分区索引,对于select 语句,优化器不考虑任何unusable index   ,除非明确指明使用 index hint强调      
    • 对于分区索引,一个或者多个分区可以unusable,, the optimizer does not consider the index if it cannot determine at query compilation time if any of the index partitions can be pruned  ,除非明确指明使用 index hint强调  .

    (5)当参数SKIP_UNUSABLE_INDEXES =FALSE

    •   当 unusable index 或者分区unusable index ,在dml操作更新索引时,会遇到错误
    • 当 select 语句遇到  unusable index 或者分区 unusable index 时,优化器不会考虑使用它,但是如果优化器使用了unusable index 就会报错

 (6)创建分区unusable index    

hr@PROD> CREATE INDEX i_emp_ename ON employees_part (employee_id)

2 LOCAL (PARTITION p1_i_emp_ename UNUSABLE, PARTITION p2_i_emp_ename);

Index created.

 (7) 现有索引变成unusable索引              

ALTER INDEX emp_email_uk UNUSABLE;

           
invisible index

   (1)从11g开始,就有了invisible index

   (2)invisible index会被优化器所忽略,但是dml操作仍然会维护索引,批量提交数据不会提示性能

   (3)如果在session或者system级别使用参数OPTIMIZER_USE_INVISIBLE_INDEXES=true,那么优化器会考虑使用invisible index

  (4)你可以使一个分区索引变成invisible index,但是你不能使单个分区变成invisible index,而其他分区visible

  (5)invisible index只是让优化器不可见,索引段中的数据还是存在的,并且dml操作维护索引,所以visible index后,不需要重建索引

    (6)创建 invisible index      

CREATE INDEX emp_ename ON emp(ename)
TABLESPACE users
STORAGE (INITIAL 20K
NEXT 20k)
INVISIBLE;

                 (7) 现有索引变成invisible index

                       ALTER INDEXindex INVISIBLE;



参考:http://docs.oracle.com/cd/E11882_01/server.112/e25494/indexes002.htm#CIHJIDJG

你可能感兴趣的:(unusable index and invisible index 的区别)