2011-07-05 18 views
1

EMP、DEPTの例を検討してください deptnoのコンテキストでEMP表を照会するのは非常に一般的です。もしあなた頻繁 クエリ:外部キーの索引が結合照会で選択されていない

select * from dept, emp 
where emp.deptno = dept.deptno and dept.deptno = :X; 

私は、従業員テーブルの上にインデックスdeptNo_idxを持っています。しかし、実行計画を見るたびに、このインデックスは使用されません。インデックスヒントを与えても役に立たなかった

どのように外部キー列のインデックスを使用するか?

答えて

4

テーブルEMPDEPTテーブルは、オプティマイザの動作を理解しようとしているときに特に使用するテーブルではありません。それらは非常に小さく、オプティマイザは完全な表スキャンが索引アクセスよりも効率的であることを頻繁に正確に判断します。さらに、比較的小さい値のDEPTNOが存在するため、オプティマイザは、EMPテーブルから比較的大きな割合の行をフェッチする必要があることを認識しています。テーブルには行が少なく、与えられた任意のDEPTNO値の行の大部分をフェッチする必要があるため、テーブルスキャンがより効率的になります。

表が大きく、さらに部門がある場合、オプティマイザは索引を使用するほうが効率的であると判断する可能性が高くなります。

+0

実際、私はこれらの表を使って問題をはっきりと表現しています。実際のテーブルは非常に大きく、インデックスのパフォーマンスが有効になります。 – dpsdce

+0

@Dhirendra - 異なるテーブルを使用している特定の問題がある場合は、テーブル定義、クエリプラン、クエリ、およびデータ配布に関する情報を投稿してください。 –

0

A)に参加、適切に使用するための構文を変更します。

select * 
from dept 
join emp on emp.deptno = dept.deptno 
where dept.deptno = :X; 

B)それは一次フィルタ(句だから、DEPT.DEPTNOにインデックスを定義します)

CREATE INDEX DEPT_DEPTNO_IDX ON DEPT(DEPTNO); 

それを飛ばす必要があります。

+0

DEPTNOは実際には部門表の主キーです。フィールドがプライマリキーかどうかは、オラクル自身がそのフィールドのインデックスを保持していると思いますか? – dpsdce

+0

明確にする:答えのパート(A)はパフォーマンスの問題に関係していません。純粋にネイターコーディングスタイルです –

関連する問題