Oracle Databaseで統計情報を復元する方法|DBMS_STATSパッケージの活用手順
本記事では、Oracle® Databaseにおいて統計情報をいつ、どのように復元すればよいのかについて解説します。
はじめに
データベース管理者(DBA)ならば、最新の統計情報を収集したところ、かえってオプティマイザが非効率な実行計画を選択してしまう――そんな経験をしたことがある方も多いのではないでしょうか。そのような場合には、パフォーマンスが良好だった時点の統計情報へ復元することを検討するとよいでしょう。
ただし、Oracle Databaseのバージョンによって、統計情報の扱い方には微妙な違いがあります。
- Oracle 10gからは、統計情報が自動的に保存されるようになり、容易に復元できるようになりました。
- 11.1以降では、統計情報の公開(パブリッシュ)を保留できる、より高度な仕組みが導入されています。
統計収集後にパフォーマンスが悪化する主な原因
オプティマイザに最適な実行計画を選択させるためには統計情報の収集が不可欠ですが、統計を収集するとSQL文の解析済み表現(カーソル)が無効化されます。その結果、統計収集後にSQL文が再解析されると、オプティマイザが元の実行計画とは異なる、より最適化度の低い実行計画を選んでしまうことがあります。
Oracle 10g以降では、dbms_statsパッケージを使用して統計情報を復元できます。このパッケージには、統計情報の「復元(restore)」と「エクスポート(export)」の両方の機能が備わっています。
デフォルト設定では、Oracleは過去の統計情報を31日間保持しますが、この保持期間は変更可能です。
現在の保持期間を確認するには、次のSQLコマンドを実行します。
保持期間を変更する場合は、以下のコマンドを実行してください。xxには希望する日数を指定します。
SQL> execute DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (xx)
さらに、次のクエリを実行すると、どの時点までの履歴統計が復元可能かを確認できます。
注: この例では、前述の日付以降の統計情報が表示されます。
テーブル統計の復元
ここでは、過去の日付のテーブル統計を復元する手順を例に説明します。
まず、次のコマンドを実行して、利用可能な統計情報の一覧を確認しましょう。
SQL> select TABLE_NAME, STATS_UPDATE_TIME from dba_tab_stats_history where table_name like 'MY_TABLE' and owner='MYSELF' order by 2;
TABLE_NAME STATS_UPDATE_TIME
--------------- --------------------------------------
MY_TABLE 20-DEC-19 05.32.26.887184 AM -05:00
MY_TABLE 20-DEC-19 10.10.19.361091 PM -05:00
MY_TABLE 21-DEC-19 05.32.14.475934 AM -05:00
MY_TABLE 21-DEC-19 10.10.18.725917 PM -05:00
MY_TABLE 22-DEC-19 10.10.17.841143 PM -05:00
MY_TABLE 23-DEC-19 05.32.56.168779 AM -05:00
MY_TABLE 23-DEC-19 10.10.23.633939 PM -05:00
MY_TABLE 24-DEC-19 05.32.14.082730 AM -05:00
MY_TABLE 24-DEC-19 10.10.21.712948 PM -05:00
MY_TABLE 25-DEC-19 05.32.13.710159 AM -05:00
MY_TABLE 25-DEC-19 10.10.17.836929 PM -05:00
MY_TABLE 26-DEC-19 05.32.14.545533 AM -05:00
MY_TABLE 26-DEC-19 10.10.12.808687 PM -05:00
MY_TABLE 27-DEC-19 05.32.13.779967 AM -05:00
この結果から、MY_TABLEがここ数日の間に何度も分析されていることがわかります。21-DEC-19 10.10.18.725917 PM -05:00に収集された統計情報を復元するには、次のコマンドを実行します。
SQL> execute dbms_stats.restore_table_stats('MYSELF','MY_TABLE','21-DEC-19 10.10.18.725917 PM -05:00');
PL/SQL procedure successfully completed.
スキーマ統計の復元
続いて、スキーマ単位で過去の統計情報を復元する手順を見ていきましょう。
21-DEC-19 10.10.18.725917 PM -05:00時点のスキーマ統計を復元するには、次のコマンドを実行します。
SQL> exec dbms_stats.restore_schema_stats(ownname=>'MYSELF', AS_OF_TIMESTAMP=>'21-DEC-19 10.10.18.725917 PM -05:00');
AS_OF_TIMESTAMPに指定できる日時を調べるには、次のコマンドを実行し、復元したい適切な日付を選択してください。
select count(*), stats_update_time from dba_tab_stats_history where owner='MYSELF'group by stats_update_time;
その他の統計情報の復元
これまでにテーブル統計とスキーマ統計の復元方法を紹介しましたが、それ以外にも以下の対象について過去の統計情報を復元できます。
- TABLE_STATS(テーブル統計)
- SCHEMA_STATS(スキーマ統計)
- DATABASE_STATS(データベース統計)
- DICTIONARY_STATS(ディクショナリ統計)
- FIXED_OBJECTS_STATS(固定オブジェクト統計)
- SYSTEM_STATS(システム統計)
保存しておきたい統計情報のエクスポート
保存しておきたい統計情報や、変更を加える前の現在の統計情報をエクスポートすることも可能です。以下の手順で行います。
-
次のようなコマンドを実行して、統計情報保存用のテーブルを作成します。
Exec dbms_stats.create_stat_table(ownname => 'MYSELF', stattab => 'MYSELF_STATS_<DATE>',tblspace => '<Tablespace Name>');
ownname: オーナー名
stattab: ユーザーMYSELF配下に作成するテーブル名
tblspace: このテーブルを作成する表領域 -
先ほど作成したテーブルに統計情報をエクスポートします。次のようなコマンドを実行してください。
exec dbms_stats.export_table_stats('SCHEMA1','TAB1',NULL,'STATS','TAG1_TAB1',TRUE);
例:
Exec dbms_stats.export_database_stats(statown => 'MYSELF', stattab => 'MYSELF_STATS');
まとめ
本記事で紹介した情報とクエリを活用すれば、あらゆる種類のデータベース統計(テーブル、データベース、スキーマ、固定オブジェクト、システム、ディクショナリ)を適切な過去の日付に復元でき、データベースの安定したパフォーマンスを維持できます。
コメントやご質問がある場合は、フィードバックタブをご利用ください。チャットでもお気軽にお問い合わせいただけます。
データベースサービスの詳細については、こちらをご覧ください。
-
Oracle 19cのDBCAコマンドでデータベースをクローンする方法【サイレントモード完全ガイド】
本記事では、Oracle Database 19cの新機能であるDatabase Configuration Assistant(DBCA)を使用して、ソースデータベースのバックアップを作成することなく、リモートのプラガブル・データベース(PDB)をコンテナ・データベース(CDB)へクローンする手順をご紹介します。 DBCAによるクローンの最大の特長は、ソースからターゲットへの複製にかかる時間が最小限に抑えられる点です。 ソースDBの構成 CDB:LCONCDB PDB:LCON 以下は、ソース側の各コンテナ(CDBおよびPDB)に存在するDBFファイルの総数です。クローン作成後は、ター
-
データベース管理者必見!Oracle Database 19cの新機能徹底解説
Oracle® Database 19cは、数多くの新機能と改善された機能を搭載して登場しました。本記事では、データベース管理者(DBA)の業務を効率化する主要な新機能について詳しく解説します。 はじめに Oracle 19cは、Oracle Database 12cリリース2製品ファミリーにおいて長期サポートが提供される最終リリースです。Linux®、Windows®、Solaris®、HP/UX®、AIX®などの各プラットフォームに加え、Oracle Cloud上でも利用可能です。Oracle 19cは、あらゆる運用系および分析系ワークロードに対して、最高レベルのパフォーマンス、スケーラビ