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。