オプティマイザには、
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)
上記の統計情報を取得することで、どのように実行計画を定めているのでしょうか。
統計情報を取得することで、どのような意味があるのでしょうか。
宜しければ、教えて頂きたいと思います。
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/analy …
ありがとうございました。
テーブルだけでなく索引の統計情報も取得する
必要があることは分かっているのですが、
その統計情報のどの値のどの部分をどのように
Oracleが確認して、実行計画を定めているのかが
気になったので聞いてみたのですが。
ですが、この部分は非公開情報なのかもしれないと
気づきました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python コードについて(初学者です) 3 2023/07/20 14:44
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- 投資・株式の税金 一般口座で同一銘柄の総平均法のことで 1 2023/02/27 22:08
- 統計学 統計検定2級の過去問について 1 2023/01/04 16:40
- Excel(エクセル) 電卓は正しいのに エクセルで計算させると間違った答えです。なぜ? 7 2022/08/11 07:04
- 統計学 アンケート調査のデータ比較をする際の統計分析方法の選択に迷っています 5 2022/04/15 01:05
- 統計学 どの統計を使えばいいのか教えてください(EZ-Rを使用) 5 2022/10/11 13:28
- Excel(エクセル) 「製品研磨」取り代時間設定の計算が複雑 2 2022/07/30 01:12
- 固定資産税・不動産取得税 マンションの土地の不動産取得税と固定資産税の計算方法の違いについて 2 2022/10/24 21:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Viewにインデックスは張れ...
-
INDEXの無効化
-
可変個数のデータはどう納める?
-
アナライズとインデックス作成...
-
blevel=3のデータ作成
-
OracleTextの索引再構築について
-
SQL*Loaderで、データを加工し...
-
テスト環境と本番環境で、DBか...
-
SQL*LoaderとInsertの違いについて
-
OSX(10.4)のSpotlight検索が恐...
-
インデックス作成後アナライズ...
-
SQLのIN句について
-
インデックスの階層数によるパ...
-
統計情報について
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
異なるスキーマからデータを抽...
-
datapumpの実行方法について
-
Access レコードを追加できませ...
-
ACCESS 複数テーブル・複数フィ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Viewにインデックスは張れ...
-
INDEXの無効化
-
SQL*Loaderで、データを加工し...
-
アナライズとインデックス作成...
-
可変個数のデータはどう納める?
-
SQL*LoaderとInsertの違いについて
-
インデックス作成後アナライズ...
-
主キー以外の項目にNotNull制約...
-
文字列中のスペースを排除する...
-
テスト環境と本番環境で、DBか...
-
OracleTextの索引再構築について
-
データ表示順序
-
統計情報について
-
SQLの処理速度改善にむけて
-
論理読み込みブロック数とは?
-
Wordで複数の索引を作りたい
-
索引の再構築をすべき?
-
IN 句ではインデックスが使用さ...
-
該当データが存在しないときに...
-
PervasiveSQL (Btrieve) で、デ...
おすすめ情報