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