0

invt_item_d列のテーブルにインデックスがあり(item_id & branch_id & co_id)ます。最初のクエリのプランの結果は でTABLE ACCESS FULL、コストは です528。2 番目のクエリの結果はINDEX FAST FULL SCAN(私のインデックス) で、コストは27です。

唯一の違いは、ご覧のとおり、選択した列が 2 番目のクエリのインデックスで使用されることです。

これに何か問題がありますか?そして、データベース管理レベルでこれを修正するにはどうすればよいか教えてください。

select d.qty
  from invt_item_d d 
 where d.item_id = 999 
   and d.branch_id = 888 
   and d.co_id = 777

select d.item_id
  from invt_item_d d 
 where d.item_id = 999 
   and d.branch_id = 888 
   and d.co_id = 777

編集: 新しいクエリを作成しました。このクエリのコストは 529 で、TABLE ACCESS FULL です。

select qty from invt_item_d

したがって、インデックスを使用するかどうかは関係ありません。これは正常だと言う人もいますが、これは本当に正常な動作ですか?

4

3 に答える 3

1

最初のケースでは、"qty" 列はテーブルにのみ格納されるため、テーブルにアクセスする必要があります。

2 番目のケースでは、クエリで使用されるすべての列をインデックスから読み取ることができ、テーブルの読み取りを完全にスキップします。

列 (item_id、branch_id、co_id、qty) に別のインデックスを追加することができ、おそらく最初のクエリで使用されます。

Oracle ドキュメントから: http://docs.oracle.com/cd/E11882_01/server.112/e25789/indexiot.htm

高速全索引スキャンは全索引スキャンであり、データベースは表にアクセスせずに索引自体のデータにアクセスし、データベースは索引ブロックを順不同で読み取ります。

次の両方の条件が満たされる場合、高速全索引スキャンは全表スキャンの代替手段となります。

  • インデックスには、クエリに必要なすべての列が含まれている必要があります。

  • すべてヌルを含む行は、クエリ結果セットに表示されません。この結果が保証されるためには、インデックス内の少なくとも 1 つの列に次のいずれかが含まれている必要があります。

    • NOT NULL 制約

    • クエリの結果セットで null が考慮されないようにするために適用される述語

于 2013-08-27T08:45:00.557 に答える
0

これはまさにインデックスを使用する主な目的です。つまり、検索を高速化します。インデックスを使用して列をクエリする方が、インデックスを使用しない列をクエリするよりも高速です。

その基本的なオラクルの知識。

于 2013-08-27T08:57:19.200 に答える