オプティマイザ (OPTIMIZER)
オプティマイザとは、指定されたデータを取り出すためのアクセス方法を導き出すパフォーマンスチューニングを行なう機能名称である。
Oracle 10g より前においてはルールベース・オプティマイザとコストベース・オプティマイザの 2 つの異なる
アプローチ方法があった。Oracle 10g からはルールベース・オプティマイザはサポートされない。
コストベース・オプティマイザ
CBO : Cost-Base-Optimizer
データの件数やデータの偏り、分布などを加味して SQL のチューニングを行なう。例えば ヒストグラム の偏りが激しいデータの場合、
インデックス・スキャンよりテーブル・フルスキャンの方が早く処理が終了する場合がある。
このようにデータの増加によって変化する環境においても定期的に統計情報の収集をすることでデータにフィットした 実行計画、 アクセスパス になるように自動的に調整される。
統計情報の収集には、 DBMS_STAT.〜*1
による 統計情報の収集 が必要。ユーザーによる統計情報のセットも可能であるがあまり一般的ではない。
Oracle 10g では既にデフォルト設定でテーブル毎に INSERT や UPDATE、
DELETE などによる変更量を監視し、毎日 22 時頃から朝方にかけて統計情報を自動的にメンテナンスされるようになっている。
新しいテーブルの場合や設定の都合で統計情報が収集されていないテーブルには 動的サンプリング が行われる。
Oracle 9i のデフォルト状態では、データ・ディクショナリに SQL文が使用するすべての表の統計が存在しない場合に、ルールベース・オプティマイザで動作する。しかし、多くの機能がコストベース・オプティマイザを必要とするため
自動的に CBO に切り替わって動作している可能性があるので要注意。(初期化パラメータ OPTIMIZER_MODE = CHOOSE)
ルールベース・オプティマイザ
RBO : Rule-Base-Optimizer (10g 以降サポート対象外)
SQL の文を分解して、その分解された情報と所定のルールによってチューニングを行なう。(格納されているデータの内容に左右されない)
Oracle 9i 以降、データ分布まで考慮してヒント句などで特別にチューニングされたパッケージ(半パッケージ)製品以外では
あまり利用されていない。(一部互換性から仕方なくという話もあるようです。)
Oracle 10g では、OPTIMIZER RULE、CHOOSE は廃止、ルールベースのサポート停止、完全廃止の方向(パラメータは現在でも設定可能)
RBO のプログラムは 1990 年代前半ごろから全く変更していないらしい=新しい機能(※1)は使用できない:使用すると CBO で動作する。(※2)
(※1) ハッシュ結合、パラレルクエリ、パーティション表 、
ビットマップインデックス、ファンクションインデックス、リバースインデックス、
索引構成表 、SAMPLE 句、スター結合、クエリー・リライト(マテリアライズドビュー)、INDEX SKIP SCAN …
ルールベースでは、これだけの機能が使用できないので、新しい Oracle でルールベース運用は相当にもったいない。(特に、ハッシュ結合、パラレルクエリ、パーティション表の機能は、ぜひに使いたい機能である。)
(※2) CBO の動作には統計情報が必要。
もしルールベースを前提に運用している環境でコストベースの機能を使用した場合には統計情報が必要になる。
そのときに統計情報が存在しなければ 動的な統計情報の取得 を試みる。
動的サンプリングが許されていない場合には、内部で用意してある デフォルトの統計情報 を参照する。
そのときのパフォーマンスはあまり期待できない。
参考:チューニングで良く見かける ルールベースのアクセスパスの順位表
優先順位 | アクセスパス |
1 | ROWID による単一行 参考:ROWID スキャンより高速なアクセスパス |
2 | クラスタ結合による単一行 |
3 | 一意キー or 主キーのハッシュ・クラスタ・キーによる単一行 |
4 | 一意キー or 主キーによる単一行 |
5 | クラスタ結合 |
6 | ハッシュ・クラスタ・キー |
7 | インデックスクラスタ・キー |
8 | 複合列によるインデックス(複合インデックス/旧名?:連結インデックス) |
9 | 単一列によるインデックス |
10 | インデックスレンジスキャン(上下限つき、前方一致) |
11 | インデックスレンジスキャン(上限または下限) |
12 | ソート・マージ結合 |
13 | インデックス列の MAX、MIN |
14 | インデックス列の ORDER BY |
15 | テーブルフルスキャン |