通过rowid执行select是否安全

时间:2013-09-04 15:32:42

标签: oracle oracle11g rowid

我想使用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进行行匹配是否与使用主键一样安全?

3 个答案:

答案 0 :(得分:4)

请参阅此相关问题:

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

在任何情况下,rowid都是行的元数据的一部分,并且在查询期间保持一致,使consistency mechanism保持列数据一致(多版本读取一致性)。 ..)。

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

答案 1 :(得分:1)

我相信使用rowid是可以的,但我不喜欢这样。你有一个主键,请使用它。我相信Oracle目前保证在查询运行期间rowid不会改变,但这是一种不好的做法。例如,如果它能够完美地运行,那么当您迁移数据库时,它确保在新的Oracle版本上能够完美地工作吗?

答案 2 :(得分:1)

如果您认为在引擎盖下Oracle自身使用ROWID来处理查询(在执行计划中考虑“TABLE ACCESS BY ROWID”),您最好相信ROWID在查询期间是可靠的。 (我的前提是读者不会阻止编写者,因此Oracle在处理记录时不会进行任何特殊的锁定。)

如果是在后续SQL语句中记录ROWID的情况,那么我会有点小心,但是对于一个自包含的查询,我会说你会好的。