Eu tenho um select que procura alguns dados por uma junção. O sistema roda Oracle 10.02g e o select fica assim
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
onde t1 possui um índice ativado (item_no, crit) e t2 possui um índice ativado (item_no, crit, X) e X é alguma coluna adicional.
O objetivo desta declaração é encontrar todos os candidatos para os quais preciso gerar dados em tabelas adicionais. Quando os novos dados foram gerados, a coluna t1.to_gen é definida como 0. No momento não está claro se o software que executa esta instrução faz confirmações intermediárias, por exemplo, gera alguns novos dados para um item_no, define t1. to_gen = 0 e confirma, antes de usar o próximo item_no do cursor da instrução em questão.
Esta instrução é executada com sucesso várias vezes ao dia em meu ambiente, mas em casos raros recebo um erro do oracle, cuja fonte não está clara para mim:
ora-01410: invalid RowID
Como a instrução select não usa a pseudocoluna RowID diretamente, o Oracle terá que usá-la internamente.
Qual é a origem deste problema?
Atualização: Por mais triste que pareça, o sistema faz commits intermediários, mas essa não é a fonte do problema.
Existem outros processos operando nas mesmas tabelas? Índices sendo reconstruídos?
Em caso afirmativo, você pode estar atingindo a situação que Jonathan Lewis descreve aqui: http://jonathanlewis.wordpress.com/2007/09/16/index-rebuild/