OracleDBの統計情報とは?なぜ取得?取得しないことの影響は?

OracleDatabaseの「統計情報」とは何か?なぜ取得するのか?

運用方法とは?について紹介します。 OracleDatabaseを運用して上で最も重要な要素の1つです。

この記事でOracleDatabase初心者でも分かりやすく統計情報について紹介していますので、

「統計情報」の概要をしっかりと学んでいきましょう。

目次

統計情報とは何か?なぜ統計情報を取得するのか?

表や索引のサイズ・データの種類・分布・特性を表す情報です。

その他DB全体・OS上の情報も統計情報としてOracleDatabaseへ保存します。

統計情報はOracleDatabaseのオプティマイザーが作成する「実行計画」を作成するためのINPUT情報として使用されます。

統計情報と実行計画作成の流れ

統計情報が存在しないと最適な実行計画が作成されないため、SQLが性能劣化する可能性が高くなります。

ただし「統計情報を取得していない」または「統計情報が古い」イコール「性能劣化」というわけではないので注意しましょう。

統計情報の種類

統計情報には多くの種類があります。 以下網羅的に統計情報と取得対象・タイミングをまとめました。

統計情報名取得する統計情報取得タイミング例
表統計行数、ブロック数、平均行長・DBの負荷が低い時間
・データの10%ほどが更新があった時
列統計列値の種類、NULLの数、データ分布・DBの負荷が低い時間
・データの10%ほどが更新があった時
索引統計リーフ・ブロック数、階層数、クラスタ化係数・DBの負荷が低い時間
・データの10%ほどが更新があった時
スキーマ統計指定したスキーマの全オブジェクトの統計情報・DBの負荷が低い時間
・データの10%ほどが更新があった時
データベース統計データベースの全オブジェクトの統計情報DB構築後の初期データロード後
ディクショナリ統計SYSTEMやSYSAUX表領域に格納されているスキーマの情報・DB負荷が低い時間に1回程度
・大規模のメンテナンス後
固定表統計動的パフォーマンス・ビューが参照している動的パフォーマンス表などの固定オブジェクト大規模のメンテナンス後
システム統計cpuspeednw(1秒当たりのCPU平均サイクル数)、ioseektim(I/Oのシーク時間)、iotfrspeed(1回のI/O要求での速度)・DB構築後
・表領域作成後

統計情報の取得はデータベースに大きい負荷を与える処理になります。

取得する頻度やタイミングも重要になりますの注意しましょう。

統計情報の取得方法

統計情報には大きく分けて3つの取得方法があります。

それぞれに特性があり、メリット・デメリットも存在しますので正しく使いこなす必要があります。

取得方法内容
自動統計収集Oracle Databaseが自動で定期的に統計情報を取得する。
デフォルトでは月~金の22時~2時、土日6時~翌2時で動作します。
自動で統計情報が取得されるため日々の運用に有効。
手動統計収集DBMS_STATSプロシージャを使用して手動で統計情報を取得。
大量データ更新後に有効。
動的サンプリングSQLをハードパースした際、統計情報が存在しない場合に統計情報の取得する。
統計情報を取り忘れてしまった場合に有効。

統計情報の運用方法と扱う時の注意事項

統計情報の運用方法を大きく分けて2つあります。

運用方法メリットデメリット
統計情報を最新化データベース最適化運用のコスト低い。
性能が技術者のスキルに依存しない。
実行計画の”予想”が外れてSQLが遅延する可能性がある。
統計情報の取得運用を設計・運用する必要がある。
統計情報を固定全SQLのアクセスパスを管理できる。常にSQL性能を運用内で管理するため運用コストが増加。
全SQLのアクセスパスを管理する必要がある。

「統計情報を取っていれば性能は安定する」というのは大きな間違いです。

また「統計情報を固定化すればSQLの性能劣化は発生しない」というのも間違いになります。

正しい知識をもって正しい統計情報運用することでデータベースをヘルシーに保つことができます。

  • システム開発、アプリ開発
  • マッチングアプリ開発
  • インフラ構築支援等、なんでもご相談ください。
よかったらシェアしてね!
  • URLをコピーしました!
目次