暗黙的な変換が失敗する理由の1つは、結合するvarchar列に数値ではないデータが含まれている場合です。 Oracleは、文字列を変換することによって数値をvarchar2結合に処理するため(Garyのコメントの引用を確認してください)、実際にこれを実行します:
select a.col1, b.somecol
from tableA a inner join tableB b on to_number(b.col2)=a.col1;
tableB.col2に数値ではない値が含まれている場合(可能性が非常に高いと思われますが、結局は文字列です)、ORA-01722: invalid number
がスローされます。 。数値列を文字列に明示的にキャストすることにより、Oracleのデフォルトの動作を短絡させます。
最初の2つの環境でこの問題が発生しないという事実は、構成ではなく運の問題です。クエリを分割するために必要な非数値文字列は1つだけなので、いつでも攻撃される可能性があります。したがって、実際には、すべての環境で明示的な変換を使用して実行する必要があります。
パフォーマンスに関しては、関数ベースのインデックスを作成できます...
create index whatever_idx on tableA ( to_char(col1) )
/