什么因素会导致 Oracle 的 ROWID 发生变化?

17

据我所知,Oracle中的ROWID代表适当数据文件中记录的物理位置。

哪些情况下记录的ROWID可能会发生变化?

我知道的一个情况是对分区表进行更新,将记录“移动”到另一个分区。

还有其他情况吗?我们大多数数据库都是Oracle 10。

3个回答

34

正如您所说,每当行在磁盘上物理移动时会发生这种情况,例如:

  • 表的导入/导出
  • ALTER TABLE XXXX MOVE
  • ALTER TABLE XXXX SHRINK SPACE
  • FLASHBACK TABLE XXXX
  • 分割分区
  • 更新一个值,使其移动到新的分区
  • 合并两个分区

如果是在索引组织表中,则对主键的更新也会给您不同的 ROWID。


1
此外,更新(例如之前为NULL值)可能会使行变得足够大,以至于无法再容纳在当前页面上。在大量更新发生的应用程序中,这可能是相当普遍的情况。 - Mike Woodhouse
2
Mike,这会导致行链接。该行的表面ROWID不变,但是在记录中,您会得到一个指向放置完整记录的另一个块的指针。 - Gary Myers
2
这将是行迁移,当行变得太大而无法适应当前块但足够大以包含在单个块中时会发生。链接发生在行太大以至于无法适应单个块时。但你说得对,在原始块中留下了指向迁移行的指针。 - David Aldridge

9

再次强调,使用 WW(Write Ahead Logging)是非常必要的。

如果问题是是否可以存储 ROWID 以供以后使用,我会说"不要这样做"。

在事务内部使用 ROWID 是可以的 - 例如收集一组 ROWID 以执行后续操作 - 但您永远不应该将 ROWID 存储在表中并假定它们在以后的某个日期可以使用。


将使用Oracle数据库更改通知功能,当行发生更改时,Oracle JDBC驱动程序仅公开ROWID信息。我相信,依赖ROWID是一个稳定的解决方案,如果您在交​​易之间不会更改表。 - Anton

8

+1 @WW

顺便提一句:

索引组织表的ROWID是不同的(我相信它们被称为UROWID),因为在对表进行更新时(当树节点分裂或合并时),行的物理位置可能会发生变化。

为了仍然实现索引,UROWID包括“逻辑ID”(主键)和“可能的物理ID”(常规ROWID),后者可能已过期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接