Oracle 11g New Feature – Invisible Indexes

我们都知道一句话,80%的调优工作在应用上。
我的同事又加了一句,应用中80%的调优工作在索引上。

在以前的版本中,如果我们想知道一张表上的索引是不是有用处,到底是应该创建还是不应该创建,除了丰富的经验来猜测判断之外,就只能是真正地创建一个索引,看看SQL效率如何,或者物理地删除一个索引,再来看看效率如何。对于小表,这样倒不是什么大问题,但是对于千万级记录的表,随意的创建或者删除一个索引都是非常耗时耗资源的操作,甚至在业务繁忙期还会造成额外的相当严重的系统Lock。

在Oracle 11g中,Invisible Indexes登场了。

ALTER INDEX ind1 INVISIBLE;
这条语句会让ind1这个索引进入隐身状态,对于Oracle的优化器(optimizer)而言,就仿佛这个索引不存在了。

ALTER INDEX ind1 VISIBLE;
重新将索引置回普通状态,优化器在计算执行计划的时候将会把这个索引考虑在内。

如果一个索引被隐身了,我们仍然可以用Hint强制使用这个索引。
SELECT /*+ index(TAB1 IND1) */ COL1 FROM TAB1 WHERE …;

索引在处于隐身状态时,DML语句仍然会更新索引,只是在查询时,Oracle优化器对这个索引视而不见了。有了Invisible Index,我们在测试索引对于SQL性能的影响时,就不会发生删除索引,影响了应用其它地方,又只能重新创建索引这样尴尬的事情。

也许有一天,在创建索引上,Oracle也能给出一个Virtual的解决方案,这样对于超大数据量的调优就更加方便了。
创建Virtual Index来改变执行计划在Oracle9i及以后版本中都已经包含,但是这是一个Undocument的功能,更加详细的测试可以参见NinGoo的文章

5 thoughts on “Oracle 11g New Feature – Invisible Indexes

  1. kangbiao says:

    个人感觉INVISIBLE这个功能似乎用处不大,以前的我们可以使用hint来实现。但是你说的建立一个虚拟的索引整个功能,倒是很有用处,不知道以后Oracle会不会实现这个功能

  2. Orion says:

    快去看变形金刚 ^_^

    天天加班,想骂人,超级不爽的天天打扫战场
    完全还不知道在说一件什么事情

    靠啊

Leave a Reply

Your email address will not be published. Required fields are marked *