如果data_object_id
在数据库中不是唯一的,就像Tanel Poder demonstrated一样(尽管是从2008年开始的),那么Oracle如何从ROWID
中唯一地确定relative_fno
,以便利用ROWID
的relative_fno
?
例如,一个分区位于不同表空间的分区表的全局索引将需要全局索引中的扩展ROWID
来唯一标识索引条目所引用的行的索引号。
我正在使用Oracle Enterprise Edition 19c,但我怀疑答案只需要Oracle 8+。
1条答案
按热度按时间wydwbb8l1#
Poder的文章演示了
ROWID
在 * 数据库 * 中的复制,而不是在 * 表 * 中的复制。当使用ROWID
时,无论是从索引还是显式地在WHERE
子句中,Oracle都知道它来自哪个表。这将data_object_id
的可能引用缩小到只有一个可能的分区/段,这意味着只有一个可能的分区/段。Poder给出的一个潜在问题的例子是一个不切实际的场景,程序使用
ROWID
作为一种跨表的全局标识符,其唯一性依赖于用户代码,这是任何人都不应该做的。(不仅尝试跨实体使用全局标识符是没有意义的,而且ROWID
永远不应该被获取它的游标的生命周期之外的代码使用,更不用说作为一个永久标识符了。它是不稳定的,如果由于更新分区键列或分区被拆分、合并或交换而导致行移动,或者如果DBA或调度管理脚本执行任何移动/重组/压缩工作,它就会发生变化。)因此,这是一个自Oracle 8引入以来可能没有人或几乎没有人会遇到的“问题”。