ITPUB??ì3
ITPUB论坛 » Oracle新技术/11g » 关于虚拟索引(Virtual Index)

标题: [Tips] 关于虚拟索引(Virtual Index)
离线 NinGoo
何乡是吾乡


来自 杭州
精华贴数 4
个人空间 235
技术积分 12969 (99)
社区积分 4335 (390)
注册日期 2004-12-7
论坛徽章:95
现任管理团队成员ITPUB元老八级虎吧徽章生肖徽章2007版:狗2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:射箭
2008北京奥运纪念徽章:水球2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:网球2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:艺术体操2008北京奥运纪念徽章:拳击

发表于 2007-5-16 11:29 
关于虚拟索引(Virtual Index)

在数据库优化中,索引的重要性不言而喻。但是,在性能调整过程中,一个索引是否能被查询用到,在索引创建之前是无法确定的,而创建索引是一个代价比较高的操作,尤其是数据量较大的时候。

虚拟索引不是物理存在的,它并不会创建实际的索引段,只是在数据字典中加了一个索引的记录,使得优化器能够意识到一个索引的存在,从而判断是否使用该索引作为访问路径。当然,实际上最终查询的访问路径是不会使用该虚拟索引的。

所以,虚拟索引的用处就是用来判断一个索引对于sql的执行计划的影响,尤其是对整个数据库的影响,从而判断是否需要创建物理索引。

oracle文档中并没有提到虚拟索引的创建语法,实际上就是普通索引语法后面加一个nosegment关键字即可,B*Tree index和bitmap index都可以。

不同版本的虚拟索引的特性可能不一样,本文的例子执行环境为:
PHP code:


NING
@ning>select from v$version;



BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 Prod

PL
/SQL Release 10.2.0.3.0 Production

CORE    10.2.0.3.0      Production

TNS 
for 32-bit WindowsVersion 10.2.0.3.0 Production

NLSRTL Version 10.2.0.3.0 
Production

--

1.创建虚拟索引
PHP code:


NING
@ning>create table test(id int,name varchar2(30));



Table created.



NING@ning>insert into test select rownum,object_name from all_objects where rownum<1001;



1000 rows created.



NING@ning>commit;



Commit complete.



NING@ning>create unique index ix_test on test(idnosegment;



Index created.



NING@ning>analyze table test compute statistics;



Table analyzed.

--

2.使用虚拟索引
PHP code:


NING
@ning>explain plan for select from test where id=1;



Explained.



NING@ning>select from table(dbms_xplan.display());



PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value1357081020



--------------------------------------------------------------------------

Id  Operation         Name Rows  Bytes Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   
SELECT STATEMENT  |      |     |    17 |     3   (0)| 00:00:01 |

|*  
|  TABLE ACCESS FULLTEST |     |    17 |     3   (0)| 00:00:01 |

--------------------------------------------------------------------------

必须设置隐含参数"_use_nosegment_indexes"=true(默认为false)后,CBO才能使用虚拟索引ix_test
PHP code:


NING
@ning>alter session set &quot;_use_nosegment_indexes&quot;=true;



Session altered.



NING@ning>select from table(dbms_xplan.display());



PLAN_TABLE_OUTPUT

----------------------------------------------------------------------------------------

Plan hash value166686173



---------------------------------------------------------------------------------------

Id  Operation                   Name    Rows  Bytes Cost (%CPU)| Time     |

---------------------------------------------------------------------------------------

|   
SELECT STATEMENT            |         |     |    17 |     2   (0)| 00:00:01 |

|   
|  TABLE ACCESS BY INDEX ROWIDTEST    |     |    17 |     2   (0)| 00:00:01 |

|*  
|   INDEX UNIQUE SCAN         IX_TEST |     |       |     1   (0)| 00:00:01 |

---------------------------------------------------------------------------------------

RBO无法使用虚拟索引
PHP code:


NING
@ning>alter session set optimizer_mode=rule;



Session altered.



NING@ning>explain plan for select from test where id=1;



Explained.



NING@ning>select from table(dbms_xplan.display());



PLAN_TABLE_OUTPUT

-----------------------------------------------------------

Plan hash value1357081020



----------------------------------

Id  Operation         Name |

----------------------------------

|   
SELECT STATEMENT  |      |

|*  
|  TABLE ACCESS FULLTEST |

----------------------------------

RBO使用hint可以使用虚拟索引
PHP code:


NING
@ning>explain plan for select /*+ index(test,ix_test)*/from test where id=1;



Explained.



NING@ning>select from table(dbms_xplan.display());



PLAN_TABLE_OUTPUT

---------------------------------------------------------------------------------------

Plan hash value166686173



---------------------------------------------------------------------------------------

Id  Operation                   Name    Rows  Bytes Cost (%CPU)| Time     |

---------------------------------------------------------------------------------------

|   
SELECT STATEMENT            |         |     |    17 |     2   (0)| 00:00:01 |

|   
|  TABLE ACCESS BY INDEX ROWIDTEST    |     |    17 |     2   (0)| 00:00:01 |

|*  
|   INDEX UNIQUE SCAN         IX_TEST |     |       |     1   (0)| 00:00:01 |

---------------------------------------------------------------------------------------

3.虚拟索引的特性

无法执行alter index
PHP code:


NING
@ning>alter index ix_test rebuild;

alter index ix_test rebuild

*

ERROR at line 1:

ORA-08114can not alter a fake index



NING
@ning>alter index ix_test rename to ix_test2;

alter index ix_test rename to ix_test2

*

ERROR at line 1:

ORA-08114can not alter a fake index

--

不能创建和虚拟索引同名的实际索引
PHP code:


NING
@ning>create index ix_test on test(name);

create index ix_test on test(name)

             *

ERROR at line 1:

ORA-00955name is already used by an existing object

--

可以创建和虚拟索引包含相同列但不同名的实际索引
PHP code:


NING
@ning>create index ix_test2 on test(id);



Index created.

--

在10g使用回收站特性的时候,虚拟索引必须显式drop,或者在drop table后purge table后,才能创建同名的索引
PHP code:


NING
@ning>drop table test;



Table dropped.



NING@ning>create unique index ix_test on test2(id);

create unique index ix_test on test2(id)

                    *

ERROR at line 1:

ORA-00955name is already used by an existing object



NING
@ning>drop index ix_test;

drop index ix_test

           
*

ERROR at line 1:

ORA-38301can not perform DDL/DML over objects in Recycle Bin



NING
@ning>purge table test;



Table purged.



NING@ning>create unique index ix_test on test2(id);



Index created.

--




__________________
只看该作者    顶部
离线 mugen
10g OCM



精华贴数 4
个人空间 0
技术积分 9857 (144)
社区积分 6110 (286)
注册日期 2002-4-5
论坛徽章:13
ITPUB元老ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章会员2007贡献徽章会员2006贡献徽章
铁扇公主授权会员ITPUB新首页上线纪念徽章生肖徽章:马生肖徽章:蛇生肖徽章:虎

发表于 2007-5-16 14:55 
Is virtual index first introduced in oracle 10g release 2?


__________________

-----------------
你就是一道风景,没必要在别人风景里面仰视
男人三十不言愁
CEIBS MBA CANDIDATE
ORACLE 11G OCM CANDIDATE
只看该作者    顶部
离线 NinGoo
何乡是吾乡


来自 杭州
精华贴数 4
个人空间 235
技术积分 12969 (99)
社区积分 4335 (390)
注册日期 2004-12-7
论坛徽章:95
现任管理团队成员ITPUB元老八级虎吧徽章生肖徽章2007版:狗2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:射箭
2008北京奥运纪念徽章:水球2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:网球2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:艺术体操2008北京奥运纪念徽章:拳击

发表于 2007-5-16 14:57 
No, you can use this feature in 9i or some other versions. I do not know exactly which version  instroduced this function.Because it's undocumented.


__________________
只看该作者    顶部
离线 mugen
10g OCM



精华贴数 4
个人空间 0
技术积分 9857 (144)
社区积分 6110 (286)
注册日期 2002-4-5
论坛徽章:13
ITPUB元老ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章会员2007贡献徽章会员2006贡献徽章
铁扇公主授权会员ITPUB新首页上线纪念徽章生肖徽章:马生肖徽章:蛇生肖徽章:虎

发表于 2007-5-16 15:04 
undocumented in any version?
i do not like some features which are undocumented.Obviously, Oracle does not recommend we use the technology which is undocumented.


__________________

-----------------
你就是一道风景,没必要在别人风景里面仰视
男人三十不言愁
CEIBS MBA CANDIDATE
ORACLE 11G OCM CANDIDATE
只看该作者    顶部
离线 NinGoo
何乡是吾乡


来自 杭州
精华贴数 4
个人空间 235
技术积分 12969 (99)
社区积分 4335 (390)
注册日期 2004-12-7
论坛徽章:95
现任管理团队成员ITPUB元老八级虎吧徽章生肖徽章2007版:狗2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:射箭
2008北京奥运纪念徽章:水球2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:网球2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:艺术体操2008北京奥运纪念徽章:拳击

发表于 2007-5-16 15:16 
Yeah, it's undocumented. But oracle uses it with OEM tuning pack.


__________________
只看该作者    顶部
离线 ZALBB
正在看龙蛇演义


精华贴数 8
个人空间 0
技术积分 35712 (25)
社区积分 16617 (108)
注册日期 2001-10-15
论坛徽章:104
      
      

发表于 2007-5-16 16:50 
NinGoo 好样的!


__________________
中国就有这么一群奇怪的人, 本身是最底阶层, 利益每天都在被损害,却具有统治阶级的意识. 在动物世界里找这么弱智的东西都几乎不可能。
                                                                                                                                                            ---------林语堂
只看该作者    顶部
离线 ZALBB
正在看龙蛇演义


精华贴数 8
个人空间 0
技术积分 35712 (25)
社区积分 16617 (108)
注册日期 2001-10-15
论坛徽章:104
      
      

发表于 2007-5-16 16:53 
不过有个问题,虚拟索引能否被分析,统计柱状图信息?

若不可以,是否因此而与实际索引在使用时,得到不一样的执行计划。


__________________
中国就有这么一群奇怪的人, 本身是最底阶层, 利益每天都在被损害,却具有统治阶级的意识. 在动物世界里找这么弱智的东西都几乎不可能。
                                                                                                                                                            ---------林语堂
只看该作者    顶部
离线 NinGoo
何乡是吾乡


来自 杭州
精华贴数 4
个人空间 235
技术积分 12969 (99)
社区积分 4335 (390)
注册日期 2004-12-7
论坛徽章:95
现任管理团队成员ITPUB元老八级虎吧徽章生肖徽章2007版:狗2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:射箭
2008北京奥运纪念徽章:水球2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:网球2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:艺术体操2008北京奥运纪念徽章:拳击

发表于 2007-5-16 17:06 


QUOTE:
最初由 ZALBB 发布
不过有个问题,虚拟索引能否被分析,统计柱状图信息?

若不可以,是否因此而与实际索引在使用时,得到不一样的执行计划。


可以分析并且有效,但是数据字典里查不到结果,估计是oracle内部临时保存了分析结果


__________________
只看该作者    顶部
离线 ZALBB
正在看龙蛇演义


精华贴数 8
个人空间 0
技术积分 35712 (25)
社区积分 16617 (108)
注册日期 2001-10-15
论坛徽章:104
      
      

发表于 2007-5-16 17:44 


QUOTE:
最初由 NinGoo 发布


可以分析并且有效,但是数据字典里查不到结果,估计是oracle内部临时保存了分析结果


此东东有没有BUG,别满心欢喜的用了之后,却发现它的执行计划与实际索引的不一样?


__________________
中国就有这么一群奇怪的人, 本身是最底阶层, 利益每天都在被损害,却具有统治阶级的意识. 在动物世界里找这么弱智的东西都几乎不可能。
                                                                                                                                                            ---------林语堂
只看该作者    顶部
离线 mugen
10g OCM



精华贴数 4
个人空间 0
技术积分 9857 (144)
社区积分 6110 (286)
注册日期 2002-4-5
论坛徽章:13
ITPUB元老ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章会员2007贡献徽章会员2006贡献徽章
铁扇公主授权会员ITPUB新首页上线纪念徽章生肖徽章:马生肖徽章:蛇生肖徽章:虎

发表于 2007-5-16 17:45 
梢苑治霾⑶矣行В鞘葑值淅锊椴坏浇峁兰剖莖racle内部临时保存了分析结果??
it is my IE 's issue or your PC's language setting?


__________________

-----------------
你就是一道风景,没必要在别人风景里面仰视
男人三十不言愁
CEIBS MBA CANDIDATE
ORACLE 11G OCM CANDIDATE
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰网域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:060528号 联系我们 法律顾问