【问题标题】:What can cause an Oracle ROWID to change?什么会导致 Oracle ROWID 发生变化?
【发布时间】:2010-09-30 21:51:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql database oracle rowid


    【解决方案1】:

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

    • 表的导出/导入
    • 更改表 XXXX 移动
    • ALTER TABLE XXXX 缩小空间
    • 闪回表 XXXX
    • 分割分区
    • 更新值以将其移至新分区
    • 合并两个分区

    如果是在索引组织的表中,那么对主键的更新也会给你一个不同的 ROWID。

    【讨论】:

    • 此外,更新(例如,以前的 NULL 值)可能会使行变得足够大,以至于无法再在其当前页面上容纳它。在发生大量 UPDATE 的应用程序中,这可能相当普遍。
    • Mike,这会导致行链接。该行的明显 ROWID 没有改变,但在记录中你会得到一个指针,指向另一个放置完整记录的块。
    • 这将是行迁移,当行增长到对于当前块来说太大但大到足以包含在单个块中时,就会发生这种情况。当行对于单个块来说太大时,就会发生链接。但是你是对的,指向迁移行的指针留在原始块中。
    【解决方案2】:

    +1 @WW

    顺便说一句:

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

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

    【讨论】:

      【解决方案3】:

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

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

      您可以在事务中使用 ROWID - 例如收集一组 ROWID 以执行后续操作 - 但您应该永远将 ROWID 存储在表中并假设它们'以后可以用了。

      【讨论】:

      • 要使用Oracle数据库更改通知功能,Oracle jdbc驱动程序在行更改时暴露的唯一信息是ROWID。我相信,依靠 ROWID 是稳定的解决方案。如果您不打算在事务之间更改您的表。
      猜你喜欢
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 2017-06-05
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      相关资源
      最近更新 更多