ora-01410 在 select 语句中偶尔出现无效的 RowID

mru*_*her 2 oracle-10g select corruption

我有一个选择,通过连接查找一些数据。系统运行Oracle 10.02g,选择如下

SELECT distinct t1.crit
  FROM table_name1 t1
 INNER JOIN table_name2 t2
    ON t1.crit = t2.crit
 WHERE NVL (t2.qty, 0) + NVL (t2.adds, 0) - NVL (t2.remove, 0) > 0
   AND t1.process_id = 'some_process_id'
   AND t1.item_no = 'some item NO'
   AND t1.to_gen = 1
Run Code Online (Sandbox Code Playgroud)

其中 t1 在 (item_no, crit) 上有一个索引,t2 在 (item_no, crit, X) 上有一个索引,X 是一些附加列。

此语句的目的是找到我需要在附加表中为其生成数据的所有候选对象。当新数据生成后,t1.to_gen 列被设置为0。目前还不清楚,如果运行这个语句的软件进行中间提交,例如为一个item_no 生成一些新数据,设置t1。 to_gen = 0 并提交,然后使用相关语句的游标中的下一个 item_no。

该语句在我的环境中每天成功执行几次,但在极少数情况下,我从 oracle 收到错误,我不清楚其来源:

ora-01410: invalid RowID
Run Code Online (Sandbox Code Playgroud)

由于 select 语句不直接使用伪列 RowID,Oracle 将不得不在内部使用它。

这个问题的根源是什么?

更新:听起来很可悲,系统会进行中间提交,但这不是问题的根源。

Col*_*art 7

是否有其他进程在同一张表上运行?正在重建索引?

如果是这样,那么您可能会遇到乔纳森刘易斯在此处描述的情况:http : //jonathanlewis.wordpress.com/2007/09/16/index-rebuild/