web-dev-qa-db-ja.com

Oracleでのインデックスの使用を強制する

インタビューでこの質問に遭遇しましたが、答える方法がわかりませんでした。

列にインデックスがあるテーブルがあり、クエリを実行します。

select * from table_name where column_having_index="some value";

クエリに時間がかかりすぎているため、インデックスが使用されていないことがわかります。インデックスを使用すると、クエリのパフォーマンスが向上すると思われる場合、どのようにクエリにインデックスを使用させることができますか?

32
Vijay

オプティマイザーのヒントを使用できます

select /*+ INDEX(table_name index_name) */ from tableなど...

オプティマイザーヒントの使用に関する詳細: http://download.Oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm

43
Rene

多くの理由インデックスが使用されていない可能性があります。 ヒントを指定の後でも、Oracleオプティマイザが別の方法で考える可能性があり、決定しないIndexを使用します。 EXPLAIN PLAN部分を調べて、INDEXを使用した場合と使用しない場合のステートメントのコストを確認する必要があります。

OracleはCBOを使用 と仮定します。ほとんどの場合、オプティマイザがINDEXでコストが高いと判断した場合、ヒントで指定しても、オプティマイザは無視して全表スキャンを続行します。最初のアクションは、統計がLAST_ANALYZEDになったときを知るためにDBA_INDEXESをチェックすることです。分析されない場合は、 テーブルの設定、分析用のインデックス を使用できます。

begin 
   DBMS_STATS.GATHER_INDEX_STATS ( OWNNAME=>user
                                 , INDNAME=>IndexName);
end;

テーブル用。

begin 
   DBMS_STATS.GATHER_TABLE_STATS ( OWNNAME=>user
                                 , TABNAME=>TableName);
end;

極端な場合は、自分で 統計の設定 を試すことができます。

13
Guru

インデックスを使用すると、クエリのパフォーマンスが向上すると思われる場合、どのようにクエリにインデックスを使用させることができますか?

最初に、インデックスが完全なデータセットを返すためのより良い結果を与えたことをもちろん検証しますか?

ここではインデックスヒントが重要ですが、それを指定する最新の方法は、インデックスの命名方法ではなく列の命名方法を使用することです。あなたの場合、次を使用します:

select /*+ index(table_name (column_having_index)) */ *
from   table_name
where  column_having_index="some value"; 

より複雑なケースでは、...

select /*+ index(t (t.column_having_index)) */ *
from   my_owner.table_name t,
       ...
where  t.column_having_index="some value"; 

複合インデックスに関しては、すべての列を指定する必要があるか必要かはわかりませんが、良いアイデアのようです。 http://docs.Oracle.com/cd/E11882_01/server.112/e26088/sql_elements006.htm#autoId18 で複数のindex_specsおよび複数のインデックスに対するindex_combineの使用に関するドキュメントを参照してください。 、およびこちら http://docs.Oracle.com/cd/E11882_01/server.112/e26088/sql_elements006.htm#BABGFHCH index_specの複数列の指定について。

12
David Aldridge

Column_having_indexには適切なインデックスがあり、実際に使用するとパフォーマンスが向上しますが、Oracleは使用しませんでした...
統計を収集する必要がありますテーブルで、オプティマイザーにインデックスアクセスが役立つことを確認させます。直接ヒントを使用することはお勧めできません。

2
Egor Rogov