当你在批量加载数据的时候,想要改变性能或者测试删除索引后的性能,可以使用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时(11g 默认是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 indexhr@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;
(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