• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コストベース・オプティマイザについて。)

コストベース・オプティマイザとは?

このQ&Aのポイント
  • コストベース・オプティマイザ(CBO)は、最適なアクセスパスを選択するために統計情報を取得し、実行計画のコストを見積もります。
  • オプティマイザ統計は、ANALYZEやDBMS_STATSパッケージを使用して取得される統計情報として知られています。
  • 統計情報を取得することで、CBOは各実行計画のコストを計算し、最も効率の良いアクセスパスを選択することができます。

質問者が選んだベストアンサー

  • ベストアンサー
noname#246547
noname#246547
回答No.1

>上記の統計情報を取得することで、どのように実行計画を定めているのでしょうか テーブルの統計のみで実行計画を作成しているわけではないです。 参考URL参照。 >統計情報を取得することで、どのような意味があるのでしょうか 結局のところ、検索結果を得るためにも最も読み込みブロック数がすくなるなるには、どのように実行計画を作成したらよいか? ということになりますので、 これを実現するためにanalyze機能を使用して、 テーブル内のブロック毎のデータ分布や、 インデックス内のブロック毎のデータ分布や、 インデックスが張ってある列のデータの偏り具合 を取得するわけです。 これらの情報を取得しておけば、 オプティマイザが、 インデックスを使用しないほうが早いことを知ったり、(※1) まったく検索しなくても良いことを知ったり、(※2) インデックスAよりBの方がコストがかからないことを知ったり(※3) 出来るわけです。 ※1の例(その1) ここに、1ブロックに全ての列データが入っているテーブルにインデックスも貼ってある場合、 インデックスを使用したほうが読み込みブロック数が多くなるので(1ブロック+インデックスのブロック=読み込みは2ブロック以上)、 全表走査したほうが速い(読み込みは1ブロック)とわかる。 ※1の例(その2) ここに、100万件のデータが入っているテーブルがあり、列Aにインデックスが張ってあるが、列Aはデータが偏っている(100万件中80万件は同一データとか、値が3種類でしかないとか)場合、 たとえ列Aのインデックスを使用しても、 インデックスを読み込むオーバーヘッドを考えると全表走査したほうが速いとわかる。 ※2の例 ここに、1000万件のデータが入っているテーブルがあり、列Bには値が100以上のデータしか入っておらず、検索条件に列B=50が指定された場合、 テーブルを一切読み込む必要が無いとわかる。 ※3の例 ※1の例(その2)のテーブルに列C(インデックス有り)があり、列C内の値の種類は99万種類(ほぼユニーク)のとき、検索条件で列Bと列Cをそれぞれ定数で指定された場合、 列Bよりも列Cのインデックスのほうが速いとわかる。

参考URL:
http://www.int21.co.jp/pcdn/oracle/article/analyze.html
skurihara2
質問者

お礼

ありがとうございました。 テーブルだけでなく索引の統計情報も取得する 必要があることは分かっているのですが、 その統計情報のどの値のどの部分をどのように Oracleが確認して、実行計画を定めているのかが 気になったので聞いてみたのですが。 ですが、この部分は非公開情報なのかもしれないと 気づきました。ありがとうございました。

関連するQ&A