是什么导致Oracle ROWID发生变化?

Dmi*_*tov 14 sql database oracle rowid

Oracle中的AFAIK ROWID表示适当数据文件中记录的物理位置.在哪种情况下,记录的ROWID可能会改变?

我所知道的是分区表上的UPDATE,它将记录"移动"到另一个分区.

还有其他案例吗?我们的大多数数据库都是Oracle 10.

WW.*_*WW. 31

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

  • 导出/导入表
  • ALTER TABLE XXXX MOVE
  • ALTER TABLE XXXX收缩空间
  • FLASHBACK TABLE XXXX
  • 拆分分区
  • 更新值以使其移动到新分区
  • 结合两个分区

如果在索引组织表中,则对主键的更新也会为您提供不同的ROWID.

  • 迈克,这将导致行链.该行的明显ROWID不会改变,但在记录中,您将获得指向放置完整记录的另一个块的指针. (2认同)
  • 这将是行迁移,当行增长到对于当前块而言太大但是足够大以包含在单个块中时发生.当行对于单个块而言太大时发生链接.但是你是正确的,指向迁移行的指针留在原始块中. (2认同)

Thi*_*ilo 8

+1 @WW

作为旁白:

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

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


Nic*_*int 8

WW的另一个+1,但只是添加一点额外...

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

您是细到一个事务中使用的ROWID -例如收集一组的ROWID的在其上进行后续操作-但是你应该永远在的ROWID存储在一个表,并承担他们将是确定在以后的使用日期.