2017-11-15 3 views
0

従業員表のcreated_date列に索引を作成しましたが、次の問合せの実行計画が表示されたら 索引が使用されていません。どうして ?order by句でインデックスを使用していますか?

Select * from employee order by created_date desc; 

1つの理解では、oracleは行IDと共に(Bツリーを使用して)ソートされた方法で作成日を保持します。だから なぜそれは既にソートされたデータを使用しないし、行IDを使用して他のデータをフェッチするのですか?

インデックスを使用しない場合、メモリ内のすべてのデータをフェッチし、並べ替えて返します。ではない ?

+3

これは、テーブルのすべての行を選択しているためです。オラクルがすべてを掴む必要があるため、この指標を使用しても意味がありません。 – Ben

答えて

0

基本表からすべての行を読み込む必要がありますか?ディスクからすべてを読み取るには、ディスク上での順序に関係なく、一括してブロック単位で読み取るのが最速の方法です。これにより、ハードディスクからの読み取り回数が最小限に抑えられます。

あなたが提案しているもの:

インデックスをご覧ください。最新の日付の行のROWIDを見つけ、その行をディスクから読み込みます。次に、次の行のROWIDを見つけ、その行をディスクから読み取ります。繰り返す。 1つは、テーブルの各行のディスクから読み取られます。

はい、このようにして、すでに行が順序付けされています(行を順序付けるCPUの作業を避ける)。しかし、ディスクからさらに多くの読み取り操作があります。いくつかの数字を補うだけで、0.8秒のCPU作業を節約し、I/O時間を40秒増加させます。 (純粋に構成されていますが、おそらく比較の順序は正しいでしょう)

+0

ありがとうございます。とった。 1つの質問は、oracleはすべての行をブロック単位で読み込み、メモリ内でソートしてから結果を返すことです – user3198603

1

ほとんどの場合、created_dateの列はNULL可能です。 where created_date is not nullため created_dateの降順で、従業員からのお問い合わせへの

where created_date is not null 

選択*を追加します。

ともう一度explain planを見てください。

インデックスを使用することは保証されませんが、フルスキャンを必要としない場合はおそらく最もよく使用されます。

Oracleのデータの大きさをチェック(私たちは手動でも、dba_tablesから照会できます)、もしCBOCost based optimization、システムの中で最も、これを(クエリが10%以上を返した場合、一般的にインデックスを必要としません)最適化のタイプがRule-based optimizationの代わりに使用される)、および関連テーブルが分析される。

  • CBOはコストが操作を完了するために必要な システムリソースに関する最も低いコストを有するものを選ぶ、いくつかのexecution plansを生成するために、データベースの統計情報を使用します。
+0

ありがとうBarbaros。それはオラクルが最初にどれだけのデータを返すかをチェックします(例えば10%)。それでインデックスをリトレースする必要があるかどうかを判断しますか? – user3198603

+0

@ user3198603はい、オラクルは、CBO(コストベースの最適化、ほとんどのシステムでは、このタイプの最適化がルールベースのoptではなく使用されています)が使用されている場合、データ量(dba_tablesからクエリできます)関連するテーブルを分析します。 –

+0

Oracleはメモリ内のすべての行を読み込み、メモリ内でソートして結果を返します。 – user3198603

関連する問題