oracle制限インデックス
SQLには多くのトラップがあり、インデックスが使用できません.一般的な例を以下に示します.
1.等しくないオペレータを使用(<>,!=)
例:表Customers、列Cust_RATINGにはインデックスがあります.
ヒント:オペレータに等しくないOR条件を変更することで、インデックスを使用して全テーブルスキャンを回避することができ、検索結果セットがテーブル容量の5%未満であることを確保しなければならない.
2.IS NULLまたはIS NOT NULLを使用
NULL値は通常インデックスを制限、テーブルの作成時にあるカラムに対してNOT NULLまたはDEFAULTを指定することは、パフォーマンスの問題を回避するのに役立ちます.
3.関数の使用
関数ベースのインデックスを使用しない場合、SQL文のWHERE句でインデックスが存在する列に対して関数を使用すると、オプティマイザはこれらのインデックスを無視します.
ヒント:比較したカラムの値を変更し、カラム自体を変更することなくインデックスを有効にすることで、外部テーブルスキャンを回避できます.
4.一致しないデータ型の比較
ヒント:これは発見しにくいですが、計画を実行しても、なぜ「全表スキャン」をしたのかを理解することはできません.
1.等しくないオペレータを使用(<>,!=)
例:表Customers、列Cust_RATINGにはインデックスがあります.
select cust_id,cust_name from customers where cust_rating<>'aa'; -- SQL
select cust_id,cust_name from customers where cust_rating<'aa' or cust_rating>'aa'; -- SQL
ヒント:オペレータに等しくないOR条件を変更することで、インデックスを使用して全テーブルスキャンを回避することができ、検索結果セットがテーブル容量の5%未満であることを確保しなければならない.
2.IS NULLまたはIS NOT NULLを使用
NULL値は通常インデックスを制限、テーブルの作成時にあるカラムに対してNOT NULLまたはDEFAULTを指定することは、パフォーマンスの問題を回避するのに役立ちます.
3.関数の使用
関数ベースのインデックスを使用しない場合、SQL文のWHERE句でインデックスが存在する列に対して関数を使用すると、オプティマイザはこれらのインデックスを無視します.
select empno,ename,deptno from emp where trunc(hiredate)=='01-MAY-81'; --
select empno,ename,deptno from emp where hiredate>='01-MAY-81' and hiredate<(TO_DATE('01_MAY_81')+0.9999); --
ヒント:比較したカラムの値を変更し、カラム自体を変更することなくインデックスを有効にすることで、外部テーブルスキャンを回避できます.
4.一致しないデータ型の比較
select name from banks where access = 123456; -- varchar ,
select name from banks where access ='123456'; --
ヒント:これは発見しにくいですが、計画を実行しても、なぜ「全表スキャン」をしたのかを理解することはできません.