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の性能劣化は発生しない」というのも間違いになります。
正しい知識をもって正しい統計情報運用することでデータベースをヘルシーに保つことができます。