oracle

Oracle統計情報について(正式にはオプティマイザ統計)

統計情報とは

統計情報とはオプティマイザが正確な実行計画を作成するために必要な情報です。統計情報の収集方法は自動動的、そして手動があります。基本的には自動+動的に任せてフレッシュな状態を維持しておけば良いのですがイレギュラーに大量データの更新や追加が発生した時などは、手動での統計情報取得を実施しないとオプティマイザが正しいプランを選択されない場合が出てきます。

Oracleのサイトをみると統計情報には以下1~4の分類があり、これらをまとめて「オプティマイザ統計」と呼称するのが正しいようです。つまりオプティマイザが最適な実行計画を導出するためには以下4種類の統計情報がフレッシュな状況である必要があります。表統計の取得は行っているけど列統計(ヒストグラム)の取得がされていない事で適切な実行プランが選択されていないような事や、表統計の取得は出来ているように見えるも、実は失効していて利用されていない事もありますのでこのあたり注意が必要です。(対象テーブルの10%に相当する行への更新が入ると無効になります。※この部分の動作はこちらで検証しています)

オプティマイザ統計とはどんな情報なのか、また何処で確認すればよいのか

  1. 表統計(DBA_TAB_STATISTICSで確認可能) 取得はこちら
    オブジェクト統計が失効しているか否かSTALE_STATSで判定可能
    • 表内の行数(NUM_ROWS)
    • 表内の使用されたデータ・ブロック数(BLOCKS)
    • 表内の行の平均の長さ(AVG_ROW_LEN)
  2. 列統計(DBA_TAB_COL_STATISTICSで確認可能) 取得はこちら
    • 列内の個別値
    • 列内のNULL数(NUM_NULLS)
    • ヒストグラム(データの偏り分布)
    • 拡張統計
  3. 索引統計(DBA_IND_STATISTICSで確認可能)
    • 索引内のリーフ・ブロックの数(LEAF_BLOCKS)
    • Bツリー・レベル(BLEVEL)
    • クラスタ化係数
  4. システム統計(AUX_STATS$で確認可能) (注1)
    • I/Oパフォーマンスと使用率
    • CPUパフォーマンスと使用率
  5. 固定オブジェクト統計(DBA_TAB_STATISTICSで確認可能) (注2)
    • 動的パフォーマンスVIEWの元表になるX$表についての統計情報

(注1)Oracleのサイトには以下のように記載があるのでめったに活用する事はないのだとおもいます。実際私も、「本番環境」への適用は経験ありません。

手動で収集する十分な理由がないかぎり、システム統計のデフォルトを使用することをお薦めします。

https://docs.oracle.com/cd/F19136_01/tgsql/gathering-optimizer-statistics.html#GUID-BABC67C0-F851-4849-906E-E2588CFD7F2B

注2)No.5はあえて分けて追記しました。本来「表統計」に含まれるものと思いますが、統計情報の取得方法が異なるためです。またOracleのサイトには以下のような記載があります。

X$表は一時的な性質があるため、システムで代表的なワークロードが発生したときに固定オブジェクトの統計を収集する必要があります。ピーク負荷時に固定オブジェクトの統計を収集できない場合、システムが実行時の状態で、最も重要なタイプの固定オブジェクト表が移入された後に収集することをお薦めします

https://docs.oracle.com/cd/E96517_01/spuss/regathering-fixed-objects-statistics.html#GUID-44B9B605-8FFE-4FFD-89A0-105CE4C4939E
表統計と列統計(ヒストグラム)

統計情報という言葉を使う際、ヒストグラムも含めた文脈で会話がされるケースと、統計情報を「表統計」に限定し、「統計情報とヒストグラム」と表現されているような事があって紛らわしいですね。そもそも、表統計と、列統計(ヒストグラム)が別物と認識のないまま会話がされている場合もあるようです。これは表統計取得のタイミングで列統計(ヒストグラム)もあわせて取得されるケースと、されないケースがありますが、このあたりからきている混乱ではないでしょうか。
適切なカラムに対しフレッシュなヒストグラムが取得されていれば適切な実行プランが選択されますが、ヒストグラムは無駄に多くのカラムに対して取得しても意味はありません。検索条件に指定されたり、結合項目となるような項目でかつ格納されているデータに偏りが見られる場合にのみ有用となります。余計な統計情報を取得してもオプティマイザにとって不要なオーバヘッドになるだけなので気を付けたいところです。

何に利用されるのかどんな良い事があるのか

オプティマイザが正確なカーディナリティを把握するための情報となり、よりコストの低い実行プランを立てる事ができるようになります。

どのタイミングでどのような条件で取得されるのか

表統計情報が取得されるタイミングでヒストグラムも収集されます。表統計、列統計情報は通常以下タイミングで取得されています。ただし「手動統計収集」以外については取得対象カラムはオラクル任せになっています。(ヒストグラムの恩恵を受けるであろうカラムが選ばれます)

1自動統計収集デフォルト月~金の22時~2時、土日6時~2時に収集される
2動的統計収集ハードパースの際条件を満たした場合収集される
3手動統計収集管理者が任意のタイミングでDBMS_STATS.GATHER_TABLE_STATS等を使って取得する
スポンサーリンク
タイトルとURLをコピーしました