Oracle ROWID,我们可以假设它在仅插入场景中是顺序的吗?

Ant*_*ony 5 oracle sequence row

ROWID仅插入表时假设顺序或升序有多安全?为什么?

我遇到过一种情况,我必须验证是否将新记录添加到没有用作参考的序列或日期列的表中。我发现ROWID最近添加的记录高于所有相关记录。因此我假设它们比参考记录更旧。然而,环顾网络,似乎有一些关于ROWID,有些甚至声称这ROWID甚至不能保证是恒定的!

我知道依赖ROWIDfor 顺序可能不是一个好主意,但这让我思考:在使用语句和仅插入时ROWID,关于值的顺序和变化提供了什么保证DELETE。oracle 有没有详细说明这些要点的官方文档?另外,ROWID在表级别或数据库级别是唯一的吗?

Mat*_*Mat 6

您基本上无法保证 ROWIDs。

来自ROWID Pseudocolumn文档:

如果您删除一行,则 Oracle 可能会将其 rowid 重新分配给稍后插入的新行。

所以这个delete场景有可能不是连续的。这ROWID编码相对文件号和块号。无法保证在为您的表分配新范围时这些会“增加”,因此如果您被分配到不同的文件或文件开头附近的块(例如,如果其他内容),您可能会看到跳回释放块)。

还要注意,像 a move(在表或分区上)之类的东西都会改变ROWIDs (因为至少行很可能会改变块)。更新时分区之间的行迁移也会改变ROWID。(由于块拆分,ROWIDs在 IOT 中可能不稳定。虽然不完全确定如何处理。)

对于您的最后一个问题,来自 Oracle 文档的同一页面:

通常,rowid 值唯一标识数据库中的一行。但是,存储在同一集群中的不同表中的行可以具有相同的 rowid。