oracle制限インデックス


SQLには多くのトラップがあり、インデックスが使用できません.一般的な例を以下に示します.
 
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'; --          

 
ヒント:これは発見しにくいですが、計画を実行しても、なぜ「全表スキャン」をしたのかを理解することはできません.