2013-12-18 19 views
6

を使用して取得されていない:私は実行計画を調べるとSQLは、私は単純なクエリを持つインデックス

SELECT * FROM MH.APPOINTMENT WHERE DOCTOR_INC_ID = 1391791151 

、私はデータをインデックス

にただし、次のクエリを使用して取得していることを参照してください。

SELECT * FROM MH.APPOINTMENT WHERE DOCTOR_INC_ID NOT IN (1391791151) 

私たちのインデックスから利益を得られません。 Oracle 11g Release2を使用しています。どんな提案も大歓迎です。ありがとう

+0

あなたはどのRDBMSを使用していますか?答えはそれに依存します。 –

+0

Oracle 11gリリース2 – cgon

答えて

7

この種類のクエリではインデックスを使用するだけで済むことはありません。それは十分に選択的ではありません。 クエリが1つの行(またはテーブルサイズと比較して少数の行、1%と言いましょう)を取得すると予想される場合は、最初にインデックスを検索してから実際の行表。しかし、クエリが99%の行を返すと予想される場合は、それらをidexで検索してから関連する行を検索するのは意味がありません。代わりに、エンジンはテーブルスキャンのためにまっすぐに行きます。

+0

ビットマップ索引を使用すると、外観が異なる場合があります。しかし、値が**選択**でない場合にのみ有用です。 –

15

米国に住んでいるときに「ニューヨーク」と「ワシントン」を探しているときは、その場所を簡単に特定できます。なぜなら、それらはあなたの記憶に索引付けされているからです。 「ニューヨーク」を除くすべての都市を尋ねられたときに、あなたはまだあなたの記憶からすべての都市を取り出す必要があります。これは明らかに以前のように簡単ではありません!

私は面白いかもしれませんが、これはインデックススキャンとフルテーブルスキャンのコンセプトです。

+0

+1良い説明のため – MinhD

+0

本当に素晴らしい例... – SriniV

関連する問題