我想使用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
进行行匹配是否与使用主键一样安全?
答案 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的情况,那么我会有点小心,但是对于一个自包含的查询,我会说你会好的。