Oracle数据存储 - 块

时间:2017-10-23 08:18:56

标签: oracle block rowid

如果一行被迁移(或链接),它的ROWID不会改变以反映新的块。为什么保留旧的rowid是有利的,即使它指向一个块,那行不再存在?

1 个答案:

答案 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)依赖它。