更新表后,如何进行索引重建?

时间:2010-08-09 14:18:29

标签: database algorithm oracle database-design indexing

original simple table A
------------------------
rowid   id  name
123      1    A
124      4    G
125      2    R
126      3    P

index on A.id
-------------
id  rowid
1   123
2   125
3   126
4   124

updated simple table A
----------------------

rowid   id  name
123      1    A
124      5    G
125      2    R
126      7    P

假设在更新表时索引没有自行更新,索引更新现在将如何发生?

它会从头开始重建吗?或者它会以某种方式使用旧索引?

4 个答案:

答案 0 :(得分:4)

索引必须标记为不可用/禁用,以便在更新行时不更新,当重新启用/标记为可用时,它将从头开始构建,因为此时索引的内容无用,但可以重复使用索引的模式。

这是与您的其他问题不同的情况,在另一种情况下,它正在重建仍然启用的索引。

答案 1 :(得分:3)

您正在询问有关Oracle索引的许多问题。毫无疑问,理解这些物品的最佳资源是Richard Foote的博客。说真的,他博客上没有其他任何内容(给大卫鲍伊偶尔发帖,但我们都有自己的缺点)。 Check it out

在目前的情况下,你应该阅读他的演讲:Oracle B-Tree Index Internals:Rebuilding The Truth

答案 2 :(得分:0)

如果您想强制进行索引重建,可以使用下面的内容:

ALTER INDEX my_index_name REBUILD WITH ONLINE = ON

但安德鲁是对的,它应该自动更新。

我建议阅读this article,这是我在索引上看到的最好的之一。

以下是有关索引更新的文章的摘录:

  

任何时候更改行,那些   必须不仅在   基表(聚簇索引或堆)   但也包含在任何索引中   受到影响的列   更改。这适用于插入,   更新和删除操作。

答案 3 :(得分:0)

您的问题依赖于DBMS。

在大多数情况下,rowid是数据库空间中行的地址的代理。有些DBMS将实际地址存储在索引中,而不是rowid,即使你只能看到一个rowid。如果DBMS在索引中存储rowid,则在直接检索行之前,某些机制仍然必须将其转换为地址。

在几乎所有DBMS中,对表的更新和对索引的更新都将在同一事务的上下文中完成。这意味着,无论索引是在表之前更新,还是在索引之前更新表,都无关紧要。

对于我所知道的唯一DBMS,在更新行本身之后立即逐行更新索引条目。索引条目包含行地址,而不是行ID。

我从来没有在实践中担心这一点,因为在交易结束时,无论如何都已经完成了。

在这些情况中,我都称之为“索引重建”。这真的是索引更新。 “索引重建”表明了一次大规模的重写。