暗黙的 変換により、オプティマイザがインデックスを使用できなくなる可能性があります。検討してください:
SQL> CREATE TABLE a (ID VARCHAR2(10) PRIMARY KEY);
Table created
SQL> insert into a select rownum from dual connect by rownum <= 1e6;
1000000 rows inserted
これは単純なテーブルですが、データ型は「正しく」ありません。つまり、このようにクエリを実行すると、フルスキャンされます。
SQL> select * from a where id = 100;
ID
----------
100
このクエリは、実際には次と同等です。
select * from a where to_number(id) = 100;
id
にインデックスを付けたため、インデックスを使用できません to_number(id)
ではありません 。インデックスを使用する場合は、明示的である必要があります :
select * from a where id = '100';
pakrのコメントへの返信: 暗黙の変換に関するルールはたくさんあります。開始するのに適した場所の1つは、ドキュメント 。特に、次のことを学びます。
これは、"WHERE column=variable"
中に暗黙的な変換が発生した場合を意味します 句を指定すると、Oracleは変数のデータ型ではなく列のデータ型を変換するため、インデックスが使用されなくなります。これが、常に正しい種類のデータ型を使用するか、変数を明示的に変換する必要がある理由です。
Oracleドキュメントから: