Database 更新表后,索引重建是如何进行的?
假设在更新表时索引没有自动更新,那么现在将如何更新索引Database 更新表后,索引重建是如何进行的?,database,algorithm,oracle,database-design,indexing,Database,Algorithm,Oracle,Database Design,Indexing,假设在更新表时索引没有自动更新,那么现在将如何更新索引 它会从零开始重建吗?或者它会以某种方式使用旧索引?当行被更新时,索引必须被标记为不可用/禁用以不更新,当它被重新启用/标记为可用时,它将从头开始构建,因为此时索引的内容是无用的,但索引的架构可以重新使用 这与您的另一个问题不同,在另一种情况下,它正在重建一个仍处于启用状态的索引。如果您想强制重建索引,可以使用下面的内容: original simple table A ------------------------ rowid id
它会从零开始重建吗?或者它会以某种方式使用旧索引?当行被更新时,索引必须被标记为不可用/禁用以不更新,当它被重新启用/标记为可用时,它将从头开始构建,因为此时索引的内容是无用的,但索引的架构可以重新使用
这与您的另一个问题不同,在另一种情况下,它正在重建一个仍处于启用状态的索引。如果您想强制重建索引,可以使用下面的内容:
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
但Andrew是对的,它应该会自动更新
我建议大家阅读,这是我见过的最好的索引之一
以下是关于索引更新的文章摘录:
任何时候一行被改变,这些
必须进行更改,而不仅仅是在
基表(聚集索引或堆)
但在任何包含
受影响的列
改变这适用于插入,
更新和删除操作
你问了很多关于Oracle索引的问题。毫无疑问,理解这些对象的最佳资源是Richard Foote的博客。说真的,他在博客上什么也没说(偶尔发一篇关于大卫·鲍伊的帖子,但我们都有自己的缺点)
在当前上下文中,您应该阅读他的演示文稿: 您的问题取决于DBMS 在大多数情况下,rowid是数据库空间中行地址的代理。有些DBMS在索引中存储实际地址,而不是rowid,即使您只能看到一个rowid。如果DBMS在索引中存储rowid,则在直接检索行之前,某些机制仍必须将其转换为地址 在几乎任何DBMS中,表的更新和索引的更新都将在同一事务的上下文中完成。这意味着索引是在表之前更新,还是表在索引之前更新,对您来说都无关紧要 对于我所知道的唯一一个DBMS,索引项是在行本身更新之后立即逐行更新的。索引项包含行地址,而不是行ID 在实践中,我从来不用担心这个问题,因为在交易结束时,一切都已经完成了 在所有这些情况下,我都不会称之为“索引重建”。这真的是索引更新。 “索引重建”意味着大规模的重写
ALTER INDEX my_index_name REBUILD WITH ONLINE = ON