インタビューでこの質問に遭遇しましたが、答える方法がわかりませんでした。
列にインデックスがあるテーブルがあり、クエリを実行します。
select * from table_name where column_having_index="some value";
クエリに時間がかかりすぎているため、インデックスが使用されていないことがわかります。インデックスを使用すると、クエリのパフォーマンスが向上すると思われる場合、どのようにクエリにインデックスを使用させることができますか?
オプティマイザーのヒントを使用できます
select /*+ INDEX(table_name index_name) */ from table
など...
オプティマイザーヒントの使用に関する詳細: http://download.Oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm
多くの理由インデックスが使用されていない可能性があります。 ヒントを指定の後でも、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;
極端な場合は、自分で 統計の設定 を試すことができます。
インデックスを使用すると、クエリのパフォーマンスが向上すると思われる場合、どのようにクエリにインデックスを使用させることができますか?
最初に、インデックスが完全なデータセットを返すためのより良い結果を与えたことをもちろん検証しますか?
ここではインデックスヒントが重要ですが、それを指定する最新の方法は、インデックスの命名方法ではなく列の命名方法を使用することです。あなたの場合、次を使用します:
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の複数列の指定について。
Column_having_indexには適切なインデックスがあり、実際に使用するとパフォーマンスが向上しますが、Oracleは使用しませんでした...
統計を収集する必要がありますテーブルで、オプティマイザーにインデックスアクセスが役立つことを確認させます。直接ヒントを使用することはお勧めできません。