虚拟索引

/*  
  结论:在数据库优化中,索引的重要性不言而喻。但是,在性能调整过程中,一个索引是否能被查询用到,在索
引创建之前是无法确定的,而创建索引是一个代价比较高的操作,尤其是数据量较大的时候。这时你就应该考虑使用虚拟索引来做个试验
*/


drop table t purge;
create table t as select * from dba_objects;
--创建虚拟索引,首先要将_use_nosegment_indexes的隐含参数设置为true
alter session set "_use_nosegment_indexes"=true;
--虚拟索引的创建语法比较简单,实际上就是普通索引语法后面加一个nosegment关键字
create index ix_t_id on t(object_id) nosegment;
explain plan for select * from t where object_id=1;
set linesize 1000
select * from table(dbms_xplan.display());
set autotrace traceonly
select * from t where object_id=1;
set autotrace off
--以下看的是真实执行计划,显然是用不到索引。
alter session set statistics_level=all;
select * from t where object_id=1;
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
--从数据字段中是无法找到这个索引的。
select index_name,status from user_indexes where table_name='T';

注:虚拟索引的几个特点
1. 无法执行alter index
2. 不能创建和虚拟索引同名的实际索引
3. 可以创建和虚拟索引包含相同列但不同名的实际索引
4. 在10g使用回收站特性的时候,虚拟索引必须显式drop,或者在drop table后purge table后,才能创建同名的索引
5. 虚拟索引分析并且有效,但是数据字典里查不到结果,估计是oracle内部临时保存了分析结果

请使用浏览器的分享功能分享到微信等