当索引键在表中更新时,索引更新如何工作?

时间:2015-10-20 16:40:09

标签: sql-server database-design indexing database-schema

在我更新表中的索引列之前,我曾经想过,同时索引也会更新。但在我的一次采访中,面试官强调说它不会那样工作。对于基表中的任何更新,索引将重建/重新组织。虽然我很确定这种情况不会发生,因为这两种操作都非常昂贵,但仍然希望通过专家的观点确定。

在考虑这个问题时,我想到了另外一件事。假设我的索引列值为1-1000。因此,根据B-Tree结构,比如值999,将从上到下到达大多数节点。现在,如果我将此列从999更新为2,则需要进行大量改组以在索引B-Tree中调整此值。如果在基表更新后索引重建/重组没有发生,将如何处理。

1 个答案:

答案 0 :(得分:0)

  

在我更新表中的索引列之前,我曾经想过,   同时索引也会更新。

是的,那是真的。与删除和插入一样。

其他索引系统可能以不同的方式工作,需要以增量方式进行更新,或者在完全独立于索引数据的情况下进行重建。这可能令人困惑。

统计需要单独更新。 (参见该小组中的其他积极讨论。)

  

对于基表中的任何更新,索引将重建/重新组织。

不,但如果SQL Server无法使节点适合其物理位置,则可能会发生页面拆分。或者,当键值发生变化时,可能会发生单个心理行动作。

两者都可能导致碎片化。碎片过多可能会导致性能问题。这就是为什么DBA发现有必要通过在方便的时候重建或重新组织索引来减少碎片。

  

假设我的索引列值为1-1000。因此,根据B-Tree结构,比如值999,将从上到下到达大多数节点。现在,如果我将此列从999更新为2,则需要进行大量改组以在索引B-Tree中调整此值。如果在基表更新后没有发生索引重建/重组,将如何处理。

只有更改的行被移动到B树中另一个页面的另一个插槽。原始插槽将保持空白。如果新页面已满,则会发生页面拆分。这会导致父页面发生更改,如果该页面也已满,则可能会发生另一次页面拆分,依此类推。这些事件可能会导致碎片化,从而导致性能下降。