我什么时候需要重建索引。
我们在数据仓库位图索引中使用。如果我截断表并且没有行,然后插入新行,据我所知应该重建索引,因为这是有道理的。
当更新或插入或删除新行时总是如此,无论是使用单个语句还是使用合并语句然后 Oracle 自动更新所有类型的索引?
我什么时候需要重建索引。
我们在数据仓库位图索引中使用。如果我截断表并且没有行,然后插入新行,据我所知应该重建索引,因为这是有道理的。
当更新或插入或删除新行时总是如此,无论是使用单个语句还是使用合并语句然后 Oracle 自动更新所有类型的索引?
如果截断表,所有索引都将是
USABLE
空的。事实上,如果一个索引是UNUSABLE
截断实际上将它标记USABLE
为它知道没有行的事实。当您
insert, update, delete, merge
等时。Oracle 通过使用新的或删除的条目重建它们的叶和(有时)分支块来维护索引的有效性。这就是为什么在表上拥有过多索引确实会减慢 DML 操作的原因,尤其是插入和删除操作。位图索引和 b 树索引都是如此。然而,一些插入可以在直接路径模式下完成。
INSERT /*+ APPEND */
, inserts withparallel dml
enabled(假设/*+ APPEND */
即使没有明确说明),SQL*Loader withdirect=true
等。这些将把索引维护推迟到语句结束。这有助于大大加快为批量操作维护索引的成本。因此,如果您加载一百万行,在加载期间索引将被忽略,但在插入最后一行后,它将重建受影响的索引块以使它们同步。因此,只要您的索引保持可用状态,它们就会始终与它们指向的数据块保持同步。在这些情况下索引可能变得不可用:
alter index ... unusable
)alter table ... move
)update indexes
。excluding indexes
您使用“ ”选项进行分区交换SKIP_INDEX_MAINTENANCE
设置了选项,或者唯一索引在索引维护阶段找到重复行。如果上述任何原因导致索引不可用,则需要手动重建索引或索引受影响的分区(
ALTER INDEX ... REBUILD
)。在此之前,对表的更改不再与索引保持同步......一个不可用的索引实际上是一个空索引,实际上,从空间角度来看是不存在的,只是一个逻辑对象,没有基础数据段。重建它实际上会创建一个段,以便它使用空间并包含条目。重建后,将对其进行维护以与进一步的数据更改保持同步。