動的サンプリング (DYNAMIC SAMPLING)
動的サンプリングとは統計情報が古過ぎる表、無効化された表、まだ統計情報が存在していない表に対してアクセスすると
コストベース・オプティマイザ (CBO) に必要な統計情報が動的にサンプリングされて共有メモリ上に仮の統計情報として自動的に利用する内部のチューニング機能である。(Oracle 9i R2) (⇔ DBMS_STAT や定期的な統計情報の収集)。
マニュアルだけで確証を得ることができなかったので予想的観測を少々行った。
DBMS_STAT パッケージを使用して収集したスタティック(静的な)統計情報が存在しない場合。動的サンプリングが発生しても仮の統計情報が統計情報として保存されないことは確認することができた。
また、以前の統計情報が存在している場合。サンプリングレベルによって補完的?な動的サンプリングが発生しても同様に上書きしないと思われる。
初期パラメータやヒントを使用せず透過的に動的サンプリングをいつも適用したい場合 DBMS_STAT.DELETE 〜
により統計情報を削除し DBMS_STAT.LOCK 〜 で統計情報をロックしてあげればよい。
毎回テーブルを大量に削除し、データ分布も毎回不定で偏りがちのデータを使用する単発動作の中規模な処理の場合ならば、動的サンプリングという手法はプランスタビリティより優れたパフォーマンスを発揮する可能性もある(未検証)。
リモート表と外部表は動的サンプリングは行われない(外部表に統計情報を収集することは可能)。
サンプリング・レベル
サンプリングレベルは OPTIMIZER_DYNAMIC_SAMPLING 初期化パラメータの値 または、
SQL に記述される /*+ DYNAMIC_SAMPLING(table_spec sampling_level) */ といったヒント句によって指定する。
サンプリング レベル 0
動的サンプリング機能を使用しない
- 初期化パラメータ OPTIMIZER_FEATURES_ENABLE = 9.2.0 以下の場合には動的サンプリングは行なわれない。
サンプリング レベル 1 ( Oracle9i デフォルト )
以下の条件に該当する分析されていないすべての表をサンプリングする。
- 分析されていない表が問合せに少なくとも1 つある
- この分析されていない表が、別の表と結合、または副問合せかマージ不可能ビューにある
- この分析されていない表に索引がない
- この分析されていない表に、動的サンプリングでサンプリングする(予定)のブロックの数よりも多いブロックがある
動的サンプリングのブロックのデフォルト数は 32
サンプリングするデータブロック数はセグメント の最初の 32 ブロックかランダムな 32 ブロックかは不明であるが、SAMPLE 句 によって取得していると考えるのが自然であると思う。
サンプリング レベル 2 ( Oracle10g デフォルト )
すべての分析されていない表をサンプリングする。
サンプリング レベル 3
レベル 2 に加えて、条件句にサンプリングした方がよさげ?(おそらくヒストグラムが存在しているような項目と思われる)な条件がある場合に追加サンプリングする。
サンプリング レベル 4
レベル 3 に加えて、2 つ以上の列を参照する単一表もサンプリング対象
サンプリング レベル 5 以上
サンプリングレベルが 5 以上の場合にはサンプリングするブロック数が増加するのみ。
統計情報が存在していて、かつ、検索の条件句が無い場合には、サンプリングは行われない。
サンプリングレベルとサンプリングするブロック数
DYNAMIC_SAMPLING は ヒント句にも記述が可能であるが、サンプリングされるブロック数が異なるので注意。
SELECT /*+ DYNAMIC_SAMPLING(table_spec sampling_level) */
サンプリング レベル | CBO 判断によるサンプリング時 | ヒント句による明示的サンプリング時 |
1 | | 32 ブロック | 32 ブロック |
2 | | 32 x 2 ブロック | 32 x 2 ブロック |
3 | 32 x 2 ブロック | 32 x 4 ブロック |
4 | 32 x 2 ブロック | 32 x 8 ブロック |
5 | 32 x 2 ブロック | 32 x 16 ブロック |
6 | 32 x 4 ブロック | 32 x 32ブロック |
7 | 32 x 8 ブロック | 32 x 64 ブロック |
8 | 32 x 32 ブロック | 32 x 128 ブロック |
9 | 32 x 128 ブロック | 32 x 256 ブロック |
10 | 全レコード | 全レコード |
統計情報のデフォルト値
Oracle のバージョンによってデフォルトの統計情報が異なる。
⇒ 動的サンプリングが無効になっている場合のデフォルト統計値
動的サンプリング 関連事項