2009-01-12 121 views
13

Oracle中的AFAIK ROWID表示记录在相应数据文件中的物理位置。 在哪些情况下记录的ROWID可能会更改?什么会导致Oracle ROWID更改?

我知道的一个是分区表上的UPDATE,它将记录“移动”到另一个分区。

是否还有其他情况?我们大部分的DB是甲骨文10

回答

30

正如你所说,它发生在任何时候排在磁盘上的物理移动,如:

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

如果是在索引组织表,然后更新主键会给你一个不同的ROWID为好。

+1

此外,更新(先前的NULL值,比方说)可能会使该行足够大,以至于无法再将其放在当前页面上。在发生大量更新的应用程序中,这可能相当常见。 – 2009-01-12 12:34:11

+2

迈克,这将导致行链。该行的明显ROWID不会更改,但在记录中,您将获得一个指向放置完整记录的另一个块的指针。 – 2009-01-12 21:48:17

8

+1 @WW

顺便说一句:

ROWID索引组织表是不同的(他们被称为UROWID,我相信),因为该行的物理位置可以更新到过程中改变表(当树节点拆分或连接时)。

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

8

另一个+1至​​WW,但只是为了增加一点额外的...

如果驱动问题是你是否可以存储供以后使用的ROWID,我会说:“不这样做”。

您是细到一个事务中使用的ROWID - 例如收集一组上的ROWID开展后续行动 - 但你应该永远的的ROWID在表中,并假设他们会是可以在以后使用。