【问题标题】:When and why oracle indexes become invalid?oracle 索引何时以及为何变得无效?
【发布时间】:2013-12-17 02:00:02
【问题描述】:

我一直认为 B 树索引在每次插入、更新或删除后总是会更新(重新平衡)。但是看起来 Oracle 在删除后没有更新它 (deleted leafs still remain in index tree)。在我们使用 B-tree 索引类型的地方插入和更新行怎么样?每次插入/更新期间是否更新索引?

另一个问题是为什么以及何时索引变得无效,因此需要重建它们?我最关心的是 B-tree 索引,但也很想知道何时必须重建其他类型的索引。

【问题讨论】:

  • 从 b-tree 索引中删除不会导致叶块在有足够可用空间时合并在一起,但是当叶块完全为空时,它会返回到“空块”列表以供重复使用。此外,从索引叶块中删除引入的空间可供其他合适的行重用,因此在重建索引之前它不是死空间。

标签: database oracle indexing


【解决方案1】:

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

【讨论】:

  • 我没有测试也不确定,但是当您更改定义索引的列的数据类型时,索引可能也会无效。可能仅适用于复合索引,即仅在多个列上定义的索引。
【解决方案2】:

正常操作下的索引在Oracle中不会失效。

而且他们也很少需要“重建”。有关详细信息,请参阅此 Ask Tom 文章。 Jonathan Lewis' blog 还包含有关此主题的非常有用的信息:

我认为索引无效的唯一可能方法是手动禁用它 (alter index foo disable) 或通过直接路径插入加载数据时,例如当使用带有direct=true 选项的 SQL*Loader 时。

编辑:

我当然忘记了分区。温弗里德的回答是对的。

【讨论】:

  • @Ben:“表重建”到底是什么意思?
  • @a_horse_with_no_name 所有数据都使用最小的逻辑单元——oracle 块写入/读取。因此,我们需要在创建表时设置正确的 PCTFREE,具体取决于表数据预计会发生多少变化。现在,索引数据也存储在 oracle 块中,也可以为索引显式设置 PCTFREE。增加表数据大小如何影响块内的索引存储?如果索引离开节点是顺序写入块的,那么当离开节点块被填满时,索引如何平衡?
  • @Centurion:请不要以 cmets 的身份创建新问题。为此创建一个新问题(可能应该去dba.stackexchange.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多