如果一行被迁移(或链接),它的ROWID不会改变以反映新的块。为什么保留旧的rowid是有利的,即使它指向一个块,那行不再存在?
答案 0 :(得分:0)
Tom Kyte几年前回答了这个问题。
请参阅:https://asktom.oracle.com/pls/apex/asktom.search?tag=row-migration
他将原因描述为双重原因:
Oracle希望在尽可能多的情况下保持rowid
不变,以使其不会意外更改并破坏依赖它的工具。
在迁移发生时偶尔花费额外的I / O来跟踪转发rowid
比“更新大量的索引数据”更有效。
就个人而言,第二个原因对我来说没有意义。目前尚不清楚为什么维护索引需要的不仅仅是删除原始条目(如DELETE
语句中所发生的那样)并添加新条目(如INSERT
}语句中所示)。是的,这是更多的工作,但如果你没有查询数据足以证明额外工作的合理性,那么你就不会有一个索引。
我确实相信第一个原因。 Oracle确实试图在可能的情况下保持rowids
不可变。我不知道是否有一个根本原因,或者仅仅是因为他们的一些工具(例如Oracle Forms)依赖它。