
クラウドサービス無料トライアル実施中!
Oracle Cloud Infrastructure/Autonomous Database/Database Cloud
初級編
1.統計情報って何ですか?
表や索引、また使用している領域、データの種類、データの分布などのデータ特性を表す情報です。
統計情報は Oracle Database がSQLの実行計画を生成する際に利用されています。
2.統計情報には具体的にどんな値があるのですか?
統計情報には大きく分けて、表統計、列統計、索引統計、システム統計が存在します。
それぞれの統計情報は、主に以下のような項目で構成されます。
- 表統計:行数、ブロック数、平均行長
- 列統計:列値の種類、NULLの数、データ分布
- 索引統計:リーフ・ブロック数、階層数、クラスタ化係数
- システム統計:CPUパフォーマンスと使用率、I/Oパフォーマンスと使用率
3.統計情報と実行計画にはどんな関係があるのですか?
実行計画は Oracle Database によって生成されますが、統計情報をインプットの一部にしています。
表や列の統計情報を使用する事によって、最もアクセス効率の良い実行計画を生成する事が可能になります。
中級編
4.各オブジェクトの統計情報を確認したいのですが、統計情報はどのように確認できますか?
SYSユーザーが所有するディクショナリ・ビューから確認することができます。
以下の統計情報が、下記のビューに格納されています。
- 表の統計情報 → DBA_TABLES
- 索引の統計情報 → DBA_INDEXES
- 列の統計情報 → DBA_TAB_COLUMNS
5.統計情報を収集しようと思うのですが、どのような方法で収集できますか?
統計情報には、以下のような収集方法があります。
- 自動統計収集:Oracle Database が自動で定期的に統計情報を取得するため、取り忘れがない。更新が行われた表を特定し、その表の統計情報のみ再取得する
- 手動統計収集:日中の大幅なデータの更新に対応するため際に有効。実行計画への影響を把握できる
- 動的サンプリング:SQLをハードパースした際、統計情報が存在しない場合に統計情報の取得する。ハードパース時の負荷や統計情報の質を考慮して使用する必要がある
6.現在の統計情報の更新状況を把握したいのですが、取得された統計情報のタイムスタンプを確認することはできますか?
SYSユーザーが所有するディクショナリ・ビューから確認することができます。
各オブジェクトのディクショナリ・ビューに、"LAST_ANALYZED"列があり、その列を参照することで、それぞれの最新の統計収集日を確認することができます。
7.ある特定のSQLのパフォーマンスを改善したいのですが、そのSQLが参照しているオブジェクトの統計情報だけを取得することは可能ですか?
DBMS_STATS パッケージを使用すると、特定のオブジェクトの統計情報だけを取得することができます。
例)表ごとの統計情報を取得する場合
EXECUTE DBMS_STATS.GATHER_TABLE_STATS('SCOTT','EMP');
例)スキーマごとの統計情報を取得する場合
EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT');
8.統計情報を収集しようと思いますが、システムの負荷上、どのようなタイミングで取得するべきでしょうか?統計情報収集の処理は、どのくらいリソースへ負荷を与えるものでしょうか?
統計情報収集の処理自体の負荷は、収集対象オブジェクトの数と収集方法によって異なります。
- 自動統計収集:更新が行われた表のみの統計情報を取得するため、ある程度負荷は抑えられる
- 手動統計収集:特定のオブジェクトのみの統計を取得する場合、負荷は最小限に抑えられる
- 動的サンプリング:ハードパース時のSQLの処理に要するメモリとCPUに負荷がかかる
参考資料