統計情報は、DBMS_STATSかANALYZEのどちらかで取得できます。DBMS_STATSコマンドでは、(デフォルトの設定では)31日前までリストアが可能なように、SYSAUX表領域に以前の統計情報の履歴が保持されます。もしANALYZEで取得するならば、「DBMS_STATS」パッケージで取得するよう変更します(2017年現在、ANALYZEは下位互換のために残されている機能です。そのため、これから使うならば「DBMS_STATS」が推奨されます)。
意図しないSQLのパフォーマンスダウンが発生し、実行計画の変化による影響が疑われる場合には、例えば、「過去の統計情報にリストアする」と改善されるか、などを調べるわけです。
統計情報のリストア手順は以下の通りです。
## LAST_ANALYZED を確認 SQL> SELECT TO_CHAR(LAST_ANALYZED,’YYYY-MM-DD HH24:MI:SS') FROM DBA_TABLES 2 WHERE OWNER='SCOTT' AND TABLE_NAME='EMP'; LAST_ANALYZED ------------------- 2015-11-25 15:53:13
## 統計情報の履歴を確認 SQL> SELECT OWNER, TABLE_NAME, STATS_UPDATE_TIME 2 FROM DBA_TAB_STATS_HISTORY WHERE TABLE_NAME='EMP'; OWNER TABLE_NAME STATS_UPDATE_TIME ---------- ---------- --------------------------------------------- SCOTT EMP 15-11-17 16:50:00.228573 +09:00 SCOTT EMP 15-11-17 17:17:03.531041 +09:00 SCOTT EMP 15-11-25 15:53:13.373593 +09:00
## パフォーマンスダウン発生前の統計に戻す(戻したい統計が使われていた時間を指定) SQL> exec DBMS_STATS.RESTORE_TABLE_STATS(- ownname=>'SCOTT',tabname=>'EMP',as_of_timestamp=>'15-11-17 17:20:00.000000'); PL/SQLプロシージャが正常に完了しました。
## 過去の統計に戻っていることを確認 SQL> SELECT TO_CHAR(LAST_ANALYZED,’YYYY-MM-DD HH24:MI:SS') FROM DBA_TABLES 2 WHERE OWNER='SCOTT' AND TABLE_NAME='EMP'; LAST_ANALYZED ------------------- 2015-11-17 17:17:03
なお、表の作成や更新処理が多く、「自動オプティマイザ統計収集」によって多くの表で統計情報が収集される環境では、意図せずSYSAUXが肥大化してしまうケースがあります。この場合は、手動で統計情報の履歴を削除したり、保持期間を31日から変更したりする対応が必要となります。
今回紹介した情報をきちんと取得しておくことで、トラブルシューティングのための原因特定に至る確率が高まります。トラブルは起きないことが一番ですが、起きてしまったときに正しく迅速に対処するための準備をしておくことが、再発防止の観点でとても重要です。
株式会社アシスト サービス事業部 サポートセンター所属。2007年にアシスト入社後、Oracle Databaseのサポート業務に従事。現在はサポート業務の傍ら、未解決のトラブルを1つでも多く減らせるよう、サポートセンターに蓄積されている調査のノウハウを社内外に伝える活動を行っている。
Copyright © ITmedia, Inc. All Rights Reserved.