Views: 111
oracleにおいて、データベースへの検索を行う際は
オプティマイザという「問い合わせ処理の最適化を行う機能」が
最適な検索の処理方法(実行計画)を決めています。
最適な検索処理方法を記述した、データ検索の最短経路を
記したものが実行計画と呼ばれています。
オプティマイザ統計はオプティマイザが最適な実行計画を選択するために
不可欠のものです。
オプティマイザ統計は次のもので構成されています
表統計(行およびブロックの統計情報)
・行数
・ブロック数
・行の平均長さ
列統計(テーブルにおける列およびデータ配分の統計情報)
列統計を用いて正確なカーディナリティ(※)の見積もりを生成し、
索引の使用、結合順序、結合方法などにより適切な決定を行います。
※カーディナリティとは
テーブルの同一の列(カラム)に含まれる異なる値の数
・列内の個別値数
・列内のnull数
・データ配分(ヒストグラム)
・拡張統計
索引統計(索引の階層の数、索引および索引とデータ・ブロックの関係に関する情報)
・リーフ・ブロック数
・レベル数
インデックスのルート・ブロックからリーフ・ブロックに達するまでに
必要なブロックの数が示されます。
・索引クラスタ化係数
索引クラスタ化係数はオプティマイザが特定の問い合わせで
索引スキャン(※1)と全表スキャン(※2)のいずれがより効率的かを判断するのに役立ちます。
テーブルのデータ格納順が索引とどれぐらい異なるかを表しているそうです。
索引クラスタ化係数が低いほど、索引スキャンが効率的であることを示しています。
※1
索引スキャン・・索引を読み込んでROWIDを取得し、
そのROWIDを使用してデータにアクセスする方法。
本で例えると、索引を見てページ番号を調べて該当ページを
開くことになるので、効率的に検索できる。
※2
全表スキャン・・必ず全てのデータ・ブロックにアクセスし、
全てのレコードを読み込み、指定された条件にマッチするかの
判定を行う。
本に例えると、知りたい情報を探すために、必ず最後のページまで目を通す。
複数のデータブロックをまとめて読み込むため、表の大部分を抽出する場合は
効率的。
システム統計
・I/Oパフォーマンスと使用率
・CPUパフォーマンスと使用率
記事の前の方で述べましたが
オプティマイザ統計はオプティマイザが最適な実行計画を
選択するために不可欠です。
データや索引の状態を正しく把握するためにも、
一定の周期で更新することが望ましいです。
私が担当しているシステムでも1日1回は更新をしていました。
オプティマイザ統計取得のコマンド
テーブル単位の統計情報取得
性能劣化が発生し、統計情報取得対象テーブルが明確である場合は、テーブル単位の
取得をお勧めします。
理由としては、データベースやスキーマ単位の統計情報取得には
時間を要するため、取得対象は限定した方が短時間で処理を完了できるからです。
exec DMBS_STATS.GATHER_TABLE_STATS
(ownname=>’OWNER’, tabname=>’TABLE_NAME’,partname=>’’,estimate_percent=>1);
OWNNAME:テーブルの所有者
TABNAME:テーブル名
PARTNAME:パーティション名
ESTIMATE_PERCENT:サンプリング範囲(※)
※
テーブルのデータサイズが巨大になれば、それだけ
統計情報の取得にも時間を要します。
統計情報を推定する際のサンプリング対象のパーセンテージを指定します。
例えば1と指定すれば、1%のデータをサンプリング対象とします。
ここに掲載しているパラメータは一部です。
スキーマ単位の統計情報取得
定期的なオプティマイザ統計の取得においては
スキーマ全体の統計情報取得も可能です。
exec DMBS_STATS.GATHER_SCHEMA_STATS
(ownname=>‘OWNER’, options=>’GATHER’);
OWNNAME:スキーマの所有者
OPTIONS:実行オプション 以下の指定が可能
GATHER 全てのオブジェクトのオプティマイザ統計統計を取得する。
GATHER AUTO Oracleが必要と判断したオブジェクトの統計情報を取得する。
判断の基準ですが、過去に私が聞いた情報では前回統計情報取得時より
データが10%変動したものが対象になるそうです。
このオプションを指定すれば、無駄な処理が省かれて処理時間も短縮されますので
個人的にはおススメです。
GATHER_EMPTY オプティマイザ統計が存在しないオブジェクトの統計情報を取得する。
オプティマイザ統計を取得するコマンドには古いバージョンのOracleで
使用されていたコマンドが非推奨ながら使えます。
ANALYZE というコマンドなんですけど
非推奨なので、Oracleのサポートは受けられません。
なので、使うな!
oracleにおいて、データベースへの検索を行う際は
オプティマイザという「問い合わせ処理の最適化を行う機能」が
最適な検索の処理方法(実行計画)を決めています。
オプティマイザ統計を適切に取得することで
性能劣化の発生リスクを下げることができます。
さて、記事を読んでいただきありがとうございます。
オプティマイザ統計に興味がある方にお勧めの本を紹介します。
その名も「門外不出のOracle現場ワザ」です。
こちらはOracleコンサルが書いたOraoceの性能劣化を理解するのに役立つと思う本です。
Oracleに対する理解を深めたいのであれば、ご一読いただくことをお勧めします。