統計情報はデフォルトの設定で自動的に履歴が一定期間保存されている(たしかOracle10gくらいから)
その履歴を使用すると統計情報を過去の状態に戻すことができる
現在の統計情報の履歴の保存期間を取得する
SELECT DBMS_STATS.GET_STATS_HISTORY_RETENTION() FROM DUAL;
統計情報の履歴の保存期間を変更する(以下は14日に変更する例)
EXEC DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (14);
統計情報の履歴を確認する
SELECT * FROM DBA_TAB_STATS_HISTORY WHERE TABLE_NAME = 'tblHIGE' ORDER BY STATS_UPDATE_TIME
以下のSQLで取得していた履歴の状態に統計情報を戻すことも可能
exec DBMS_STATS.RESTORE_TABLE_STATS ( ownname => 'SCOTT', tabname => 'tblHOGE', as_of_timestamp => '2012-01-31 10:00:00.000000') ;
上記はユーザ「SCOTT」、テーブル「tblHOGE」の統計情報を指定した時間の状態に戻す例
なお、Analyzeでは履歴が取得されないので、DBMS_STATSで統計情報を取得したほうが良い
(Analyzeは下位互換の命令のため、DBMS_STATSを使用するのが推奨されている)
DBMS_STATSでの統計情報取得例
EXEC DBMS_STATS.GATHER_TABLE_STATS( OWNNAME => 'SCOTT' ,TABNAME => 'tblHOGE' );
関連する記事
http://d.hatena.ne.jp/haradago/20090918
動作確認環境Oracle 11g