何时以及为什么Oracle索引会变为无效状态?

3
我一直认为B树索引在每次插入、更新或删除后都会更新(重新平衡)。然而,看起来Oracle在删除后不会更新它(已删除的叶子节点仍留在索引树中)。那么,在使用B树索引类型插入和更新行时,索引是否会在每次插入/更新时更新呢?
另一个问题是为什么和何时索引会变得无效,需要重新构建?我主要关心B树索引,但也想知道其他类型的索引必须何时重建。

从B树索引中删除不会导致叶块在有足够空闲空间时合并在一起,但是当叶块完全为空时,它将被返回到“空块”列表以供重新使用。此外,从索引叶块中删除引入的空间可供其他适当行重用,因此在重建索引之前它不是死空间。 - David Aldridge
2个回答

4

当您拥有全局索引的分区表并且从该表中删除一个分区时,索引会变得无效。然而,当您删除一个分区时,可以指定隐式重建索引。


1
我没有测试,也不确定,但可能当您更改某个索引定义的列的数据类型时,索引也会失效。也许只是对于复合索引,即仅定义在多个列上的索引。 - Wernfried Domscheit

3
在Oracle中,正常情况下索引不会变得无效,也很少需要“重建”。有关详细信息,请参阅Ask Tom文章。Jonathan Lewis的博客还包含有关此主题的非常有用的信息:链接
我能想到的仅有的导致索引无效的可能方法是手动禁用它(alter index foo disable)或通过直接路径插入加载数据(例如,在使用SQL*Loader时使用direct=true选项)。
编辑:
当然,我忘记了分区。Winfried 的回答是正确的。

@Ben:你说的“表重建”具体是什么意思? - user330315
@a_horse_with_no_name 所有数据都是使用最小的逻辑单元 - Oracle块来写入/读取的。因此,我们需要在创建表时设置正确的PCTFREE,具体取决于预计要更改多少表数据。现在,索引数据也存储在Oracle块中,并且还可以显式地为索引设置PCTFREE。增加表数据大小如何影响块内索引存储?如果索引叶节点按顺序写入块中,那么当叶节点块填满时,如何平衡索引? - Centurion
@Centurion:请不要将新问题创建为评论。为此创建一个新问题(那个可能应该去http://dba.stackexchange.com)。 - user330315

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接