sql >> データベース >  >> RDS >> Oracle

型変換のためにインデックスが使用されていませんか?

    暗黙的 変換により、オプティマイザがインデックスを使用できなくなる可能性があります。検討してください:

    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ドキュメントから:



    1. ローカルインデックスによるページングのためのOracleプランのパーティションごとにSTOPKEYがありません

    2. PL/SQL (任意の年の任意の四半期の最初と最後の日を計算する方法)

    3. 複数の特殊文字を含むMySQL選択文字列

    4. SQLDeveloperで表の作成中にエラーORA-00907が発生する