Wednesday, February 3, 2010

過去の統計情報を分析しましょう。

Oracle 10g以降からは統計情報が更新されるたびに以前の統計情報をディクショナリーに貯蔵します。統計情報更新によって性能問題が発生した時、以前の統計情報で復元するための目的です。


でも過去の統計情報を問い合わせる簡単な方法はなさそうです。たぶんディクショナリーを直接クエリするのが雄一な方法みたいです。


  • SYS.WRI$_OPTSTAT_TAB_HISTORY: テーブル統計情報
  • SYS.WRI$_OPTSTAT_HISTHEAD_HISTORY:列統計情報
  • SYS.WRI$_OPTSTAT_HISTGRM_HISTORY:ヒストグラム統計情報
  • SYS.WRI$_OPTSTAT_IND_HISTORY:索引統計情報

このテーブルたちを問い合わせて過去の特定の時点のテーブルの統計情報を確認する簡単なスクリプトを作ってみれば次のようです。


(簡単なサンプルに過ぎませんので、運営システムで使用しようとすれば補完が必要です)

--------------------------------------------------------------------------------
-- @name: tab_stat_hist
-- @author: dion cho
-- @note: show stats gathering history
-- @usage: @tab_stat_hist

過去の索引統計情報やパーティション統計情報なども同じ方法で得られます。


この方法を利用すれば統計情報更新の後、実行計画の変わった場合、統計情報の変化を追跡できます。以前のバージョンではできなっかた重要な改善だと言えます。とくにAWRのようなデータと連動してよく使えば有効な道具になるはずです。