Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 更新表后,索引重建是如何进行的?_Database_Algorithm_Oracle_Database Design_Indexing - Fatal编程技术网

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