OracleDB の本番環境にて定期的に統計情報取得していますが、あるタイミングで取得した統計情報から実行計画が変わり、SQL の性能が劣化する場合があります。
今回はそんな時に有効な統計情報のリストアについて説明します。
統計情報 リストアを実施する場合の要件
統計情報のリストアを実施する場合、以下の要件を満たす必要があります。
- リストアしたい統計情報が、統計情報のバックアップ保持期間内(デフォルト31日)である
- 統計情報取得に DBMS_STATS パッケージ、SET_*_STATS プロシージャを使用している
(「analyze」コマンドでの統計情報取得では、統計情報のリストアは使用できません。)
統計情報 リストア手順
統計情報のリストアは、データベース単位、スキーマ単位、テーブル単位で実施できます。
今回は、テーブル単位でリストアする際の手順を説明します。
1. 統計情報保存期間の確認
統計情報保存期間を確認します。
SQL> select DBMS_STATS.GET_STATS_HISTORY_RETENTION from dual; GET_STATS_HISTORY_RETENTION --------------------------- 31
2. 統計情報取得履歴の確認
自動バックアップされた、リストア対象テーブルの統計情報取得履歴を確認します。
select owner, table_name, stats_update_time
from dba_tab_stats_history
where owner=’該当テーブルのオーナ名‘
and table_name=’該当テーブル名‘;
from dba_tab_stats_history
where owner=’該当テーブルのオーナ名‘
and table_name=’該当テーブル名‘;
SQL> select owner,table_name,stats_update_time from dba_tab_stats_history 2 where owner='TESTUSER' and table_name='TEST1'; OWNER TABLE_NAME STATS_UPDATE_TIME -------- ---------- ------------------------------------ TESTUSER TEST1 18-01-31 22:04:19.941000 +09:00 TESTUSER TEST1 18-02-11 06:00:28.919000 +09:00
3. 統計情報のリストア
SQLの性能が劣化するよりも前に取得した統計情報をリストアします。
exec DBMS_STATS.RESTORE_TABLE_STATS
(ownname =>’該当テーブルのオーナ名‘,
tabname =>’該当テーブル名‘,
as_of_timestamp =>’リストア時刻‘);
(ownname =>’該当テーブルのオーナ名‘,
tabname =>’該当テーブル名‘,
as_of_timestamp =>’リストア時刻‘);
as_of_timestamp=>’リストア時刻’には、2.で取得したSTATS_UPDATE_TIMEの値を指定して下さい。
なお、強制的にリストアを行う場合は force オプション「force=>TRUE」を指定します。
SQL> exec DBMS_STATS.RESTORE_TABLE_STATS (ownname=>'TESTUSER', tabname=>'TEST1', as_of_timestamp=>'18-01-31 22:04:19.941000 +09:00'); PL/SQLプロシージャが正常に完了しました。
4. 統計情報取得履歴の再確認
リストアした時間の取得履歴が表示されることを確認します。
SQL> select owner,table_name,stats_update_time from dba_tab_stats_history 2 where owner='TESTUSER' and table_name='TEST1'; OWNER TABLE_NAME STATS_UPDATE_TIME -------- ---------- ------------------------------------ TESTUSER TEST1 18-03-01 16:57:32.926000 +09:00 ★ TESTUSER TEST1 18-01-31 22:04:19.941000 +09:00 TESTUSER TEST1 18-02-11 06:00:28.919000 +09:00
1行目に新しくリストアした時間の取得履歴が追加されています。
手順の詳細は、以下も参考にしてみてください。
[参考] 門外不出のOracle現場ワザ/Part3 オプティマイザ統計の管理
http://www.oracle.com/technetwork/jp/articles/chapter4-3-093504-ja.html#p01a
[参考] Oracle Database PL/SQLパッケージおよびタイプ・リファレンス
https://docs.oracle.com/cd/E57425_01/121/ARPLS/d_stats.htm