Virtual Indexes
Oracle11g 中有个invisiable index的新功能,它的前身或许就是virtual index (虚拟索引)。
在建新索引的时候,Virtual Index和invisiable index都可以用来确保其他SQL的执行计划不会改变。特别是当表上索引结构比较复杂,为了优化某个SQL而新建的索引可能会导致其它SQL执行计划变糟糕。
CREATE INDEX INDEX_NAME
ON TABLE_NAME (INDEX_COLUMN)
NOSEGMENT;
建立虚拟索引后,可以使用收集该虚拟索引的统计信息,以便更好的帮助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。
invisible index 确实应该是用来解决virtual index无法解决的问题的, 但不完全是..
比如可以直接将某个index 改为invisible就可以避免系统使用一个已有索引, 这在由个别索引导致执行计划出问题时也是很有帮助的..
生产库用过吗? 太花哨的不一定就那么好使
用过几次,还好。建索引和删除索引的时候,在很忙得表上,基本上对性能没有影响。