Oracleには、SQLの実行処理時に、実行計画を作成してくれます。
オプティマイザにも下記の2種類が存在します。
- CBO
- RBO
CBO(コストベース・オプティマイザ)
テーブル、列、索引等の統計情報を使用して、最適な実行計画を立てていく方式です。
メリット
データの件数の偏りに左右されず、最適な実行計画を立てることができる。
デメリット
データ件数が一気に増減した場合に、最適な実行計画を立てずに古い実行計画のまま実行してしまうと、突然パフォーマンスが低下する可能性がある点。
RBO(ルールベース・オプティマイザ)
※Oracle10g以降はサポート対象外になっています。基本は、CBOを使います。
あらかじめ決められたルールを元に実行計画を作成する方式です。(例えば、検索条件として指定された列に、索引が作成されているか確認し、その索引を利用する等)
メリット
データの増減に左右されず、安定した実行計画を作成することができる点。
デメリット
データの偏り(件数等)によって、もっと最適なSQLを作成できるのにも関わらずできない点。
Oracleの新機能に対応できていない点(RBOが10g以降サポート対象外になったのは、この理由も大きいみたいです。)
オプティマイザの設定方法
該当のOracleDBが、どのオプティマイザを使用するかは下記の「初期化パラメータ」で設定します。
1 |
ALTER SESSION SET OPTIMIZER_MODE = "設定値" |
設定値の種類
設定値 | 説明 |
---|---|
CHOOSE | デフォルト値、SQLの該当テーブルに、一つでも統計情報があればCBO、なければRBOを使う。 |
RULE | RBO固定 |
FIRST_ROWS | CBO固定、最初の1行の応答時間を最小に抑える実行計画とする。 |
FIRST_ROWS_n | CBO固定、最初のN行の応答時間を最小に抑える実行計画とする。 |
ALL_ROWS | CBO固定、全体の処理時間を最小に抑える実行計画とする。 |
カタログマネージャとは?
オプティマイザが実行計画を立てる際にオプティマイザに重要な情報を提供します。
カタログとは?
DBMSの内部情報を集めたテーブル群になります。このカタログの情報を「統計情報」と呼んだりもします。
統計情報とは?
カタログマネージャが管理している情報です。これらの情報を利用してオプティマイザは実行計画を作成します。
- 各テーブルのレコード数
- 各テーブルの列数と列のサイズ
- 列値のカーディナリティ(値の個数)
- 列値のヒストグラム(どの値がいくつあるかの分布)
- 列内にあるNULLの数
- インデックス情報
統計情報の更新について
適切な実行計画を作成するには統計情報を更新することが重要です。
対象のテーブルやインデックスのサイズと数によっては数十分〜数時間要することもあります。
各DBMSごとに統計情報更新用のコマンドが用意されています。
JIT(Just In Time)について
クエリ実行時に統計情報をリアルタイムに収集するDBMSのことです。メリットばかりのようですが、統計情報の取得自体に数十分とかかる場合があるのでメリットばかりではないです。
この記事へのコメントはありません。