2

我想知道使用 rowid 进行行匹配是否安全?

我有以下查询:

select * from a,
    (select a.rowid rid, <some_columns_omitted> from a, b, c where a.some_column = b.some_column ... <joining_omitted>
     union all
     select a.rowid rid, <some_columns_omitted> from a, d, e where a.some_column = d.some_column ... <joining_omitted>
     union all ....) sub_query
where a.rowid = sub_query.rid

使用rowid行匹配会和使用主键一样安全吗?

4

3 回答 3

4

请参阅此相关问题:

Oracle 保证,只要行存在,它的 rowid 就不会改变。Rowid 仅在非常特殊的情况下才会更改(表重建、启用行移动的分区表、更新到 pk 的索引组织表)。在堆表上,更新不会导致 rowid 更改,即使行已迁移(因为它不再适合块)。

在任何情况下,rowid它都是行元数据的一部分,并将在查询期间保持一致,具有保持列数据一致的相同一致性机制(多版本读取一致性......)。

此外,如果您锁定行以进行更新(与主键相同),则跨查询使用 rowid 是安全的。按 rowid 访问行也比主键查找更快(因为主键查找是索引扫描 + rowid 访问)。

于 2013-09-04T15:53:00.900 回答
1

我相信使用 rowid 是可以的,但我不喜欢那样。您有一个用于此目的的主键,请使用它。我相信 Oracle 目前保证 rowid 在查询运行期间不会更改,但这是一种不好的做法。例如,如果它完美运行,谁保证在迁移数据库时它会在较新的 Oracle 版本上完美运行?

于 2013-09-04T16:26:15.673 回答
1

如果您认为 Oracle 本身在后台使用 ROWID 来处理查询(想想执行计划中的“TABLE ACCESS BY ROWID”),您最好相信 ROWID 在查询期间是可靠的。(我还假设读者不会阻止作者,因此 Oracle 在处理记录时不会进行任何特殊锁定。)

如果是记录 ROWID 以在后续 SQL 语句中使用的情况,那么我会有点谨慎,但对于自包含查询,我会说你会没事的。

于 2013-09-04T17:03:51.610 回答