代码之家  ›  专栏  ›  技术社区  ›  Moeb

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

  •  0
  • Moeb  · 技术社区  · 16 年前
    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 回复  |  直到 16 年前
        1
  •  4
  •   Andrew    16 年前

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

    这与您的另一个问题不同,在另一种情况下,它正在重建一个仍处于启用状态的索引。

        2
  •  3
  •   APC    16 年前

    Check it out .

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

        3
  •  0
  •   Abe Miessler    16 年前

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

    ALTER INDEX my_index_name REBUILD WITH ONLINE = ON
    

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

    我建议你读书 this article ,这是我见过的最好的索引之一。

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

    任何时候一行改变了,那些 基表(聚集索引或堆) 但在任何包含 受影响的列 改变。这适用于插入, 更新和删除操作。

        4
  •  0
  •   Walter Mitty    16 年前

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

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

    在实践中我从来不用担心这个问题,因为到了交易结束时,一切都已经完成了。

    在这些情况下,我都不会称之为“索引重建”。它实际上是索引更新。 “索引重建”意味着大规模的重写。