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的解决方案,这样对于超大数据量的调优就更加方便了。…

Continue ReadingOracle 11g New Feature – Invisible Indexes