プロが教える店舗&オフィスのセキュリティ対策術

オプティマイザには、

 1)ルールベース・オプティマイザ(RBO)
 2)コストベース・オプティマイザ(CBO)

があります。


RBO は、決められたアクセスパスの優先順位に従って
実行計画を選択することが分かりました。

CBO は、最適なアクセスパスを選択する為に、
オプティマイザ統計を取得し、実行計画のコストを
見積もることが分かりました。

★このオプティマイザ統計に関して、質問があります。

 オプティマイザ統計は、ANALYZE や DBMS_STATS パッケージを
 使用することで取得する統計情報ということが分かりました。

 しかし、統計情報を取得することでどのように実行計画が
 改善されるのか、この部分のイメージが掴めません。

================================================================
例えば、表の統計情報を取得すると、以下のようになりました。

SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE,CHAIN_CNT
2 ,AVG_ROW_LEN
3 from user_tables where table_name='EMP';

NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN
---------- ------ ------------ --------- ---------- -----------
  15 5 0 0 0 35
================================================================

 それぞれのカラムの意味は以下であることが分かりました。

  《上記のカラムの説明》

  NUM_ROWS   = 行数
  BLOCKS    = 使用ブロック数
  EMPTY_BLOCKS = 未使用ブロック数
  AVG_SPACE  = 空き領域の平均サイズ(bytes)
  CHAIN_CNT   = 行連鎖・行移行の行数
  AVG_ROW_LEN = 行の平均長(bytes)

 
 上記の統計情報を取得することで、どのように実行計画を定めているのでしょうか。
 統計情報を取得することで、どのような意味があるのでしょうか。

 宜しければ、教えて頂きたいと思います。

A 回答 (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/analy …
    • good
    • 0
この回答へのお礼

ありがとうございました。

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

ですが、この部分は非公開情報なのかもしれないと
気づきました。ありがとうございました。

お礼日時:2007/05/20 18:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!