Virtual Indexes

April 10th, 2010 | Categories: Boring | Tags:

Oracle11g 中有个invisiable index的新功能,它的前身或许就是virtual index (虚拟索引)。

在建新索引的时候,Virtual Index和invisiable index都可以用来确保其他SQL的执行计划不会改变。特别是当表上索引结构比较复杂,为了优化某个SQL而新建的索引可能会导致其它SQL执行计划变糟糕。

CREATE INDEX INDEX_NAME
ON TABLE_NAME (INDEX_COLUMN)
NOSEGMENT;

建立虚拟索引后,可以使用dbms_stats.generate_stats收集该虚拟索引的统计信息,以便更好的帮助CBO判断。

SQL> select OBJ#,DATAOBJ#,BLEVEL,LEAFCNT,DISTKEY,LBLKKEY,DBLKKEY,CLUFAC,ROWCNT from ind$ where obj#=57598;

OBJ#   DATAOBJ#     BLEVEL    LEAFCNT    DISTKEY    LBLKKEY    DBLKKEY     CLUFAC     ROWCNT
———- ———- ———- ———- ———- ———- ———- ———- ———-
57598      57598          1        272      17389          1          2      47175     100000

dbms_stats.gather_index_stats无法分析virtual index。

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
  1. jametong
    April 10th, 2010 at 19:07
    Quote | #1

    invisible index 确实应该是用来解决virtual index无法解决的问题的, 但不完全是..

    比如可以直接将某个index 改为invisible就可以避免系统使用一个已有索引, 这在由个别索引导致执行计划出问题时也是很有帮助的..

  2. netbanker
    April 20th, 2010 at 07:00
    Quote | #2

    生产库用过吗? 太花哨的不一定就那么好使

  3. yumianfeilong
    April 20th, 2010 at 08:33
    Quote | #3

    netbanker:
    生产库用过吗? 太花哨的不一定就那么好使

    用过几次,还好。建索引和删除索引的时候,在很忙得表上,基本上对性能没有影响。