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


您有 2 条公共消息
  • 来自: 公共消息 标题: ITPUB邮箱已经恢复 内容: ITPUB邮箱用户请注意,邮箱现在已经恢复 web访问地址 http://emai ...
  • 来自: 公共消息 标题: 3-5月ITPUB数据库 ... 内容: ITPUB与3月和5月分别安排了Oracle 11g DBA和Oracle性能优化培训,以及 ...

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


    来自 杭州
    精华贴数 5
    个人空间 235
    技术积分 13248 (108)
    社区积分 4341 (435)
    注册日期 2004-12-7
    论坛徽章:98
    管理团队成员ITPUB元老八级虎吧徽章生肖徽章2007版:蛇祖国60周年纪念徽章生肖徽章2007版:龙
    生肖徽章2007版:狗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
    技术积分 9905 (162)
    社区积分 6115 (325)
    注册日期 2002-4-5
    论坛徽章:14
    ITPUB元老ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章会员2007贡献徽章会员2006贡献徽章
    铁扇公主授权会员ITPUB8周年纪念徽章ITPUB新首页上线纪念徽章生肖徽章:马生肖徽章:蛇

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


    __________________

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


    来自 杭州
    精华贴数 5
    个人空间 235
    技术积分 13248 (108)
    社区积分 4341 (435)
    注册日期 2004-12-7
    论坛徽章:98
    管理团队成员ITPUB元老八级虎吧徽章生肖徽章2007版:蛇祖国60周年纪念徽章生肖徽章2007版:龙
    生肖徽章2007版:狗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
    技术积分 9905 (162)
    社区积分 6115 (325)
    注册日期 2002-4-5
    论坛徽章:14
    ITPUB元老ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章会员2007贡献徽章会员2006贡献徽章
    铁扇公主授权会员ITPUB8周年纪念徽章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
    何乡是吾乡,归期未有期


    来自 杭州
    精华贴数 5
    个人空间 235
    技术积分 13248 (108)
    社区积分 4341 (435)
    注册日期 2004-12-7
    论坛徽章:98
    管理团队成员ITPUB元老八级虎吧徽章生肖徽章2007版:蛇祖国60周年纪念徽章生肖徽章2007版:龙
    生肖徽章2007版:狗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
    技术积分 40735 (23)
    社区积分 18461 (110)
    注册日期 2001-10-15
    论坛徽章:130
    现任管理团队成员     
          

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


    __________________
    对内,共匪什么都要,就是不要脸;对外,共匪什么都不要,就是要脸。
    只看该作者    顶部
    离线 ZALBB


    精华贴数 8
    个人空间 0
    技术积分 40735 (23)
    社区积分 18461 (110)
    注册日期 2001-10-15
    论坛徽章:130
    现任管理团队成员     
          

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

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


    __________________
    对内,共匪什么都要,就是不要脸;对外,共匪什么都不要,就是要脸。
    只看该作者    顶部
    离线 NinGoo
    何乡是吾乡,归期未有期


    来自 杭州
    精华贴数 5
    个人空间 235
    技术积分 13248 (108)
    社区积分 4341 (435)
    注册日期 2004-12-7
    论坛徽章:98
    管理团队成员ITPUB元老八级虎吧徽章生肖徽章2007版:蛇祖国60周年纪念徽章生肖徽章2007版:龙
    生肖徽章2007版:狗2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:射箭2008北京奥运纪念徽章:水球2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:网球

    发表于 2007-5-16 17:06 


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

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


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


    __________________
    只看该作者    顶部
    离线 ZALBB


    精华贴数 8
    个人空间 0
    技术积分 40735 (23)
    社区积分 18461 (110)
    注册日期 2001-10-15
    论坛徽章:130
    现任管理团队成员     
          

    发表于 2007-5-16 17:44 


    QUOTE:
    最初由 NinGoo 发布


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


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


    __________________
    对内,共匪什么都要,就是不要脸;对外,共匪什么都不要,就是要脸。
    只看该作者    顶部
    离线 mugen
    10g OCM



    精华贴数 4
    个人空间 0
    技术积分 9905 (162)
    社区积分 6115 (325)
    注册日期 2002-4-5
    论坛徽章:14
    ITPUB元老ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章会员2007贡献徽章会员2006贡献徽章
    铁扇公主授权会员ITPUB8周年纪念徽章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号 联系我们