【OracleSQL】「統計情報が古い」とはどういうことか


ここではORACLEデータベースで「統計情報が古い」の意味について簡単に紹介します。

統計情報の取得方法や取得日付を確認する方法は↓で紹介していますのでぜひ参考にしてください。
>>【ORACLE】表の統計情報を取得するSQL
>>【ORACLE】表の統計情報取得日を確認するSQL

統計情報とは

統計情報とは簡単に説明すると表(テーブル)や索引(インデックス)、列(カラム)の値やレコード件数などの情報のことです。これらの情報が記録されたものを統計情報と呼びます。

統計情報については↓で詳しく解説していますので参考にしてください。
>>【ORACLE】テーブルやインデックスの「統計情報」とは

統計情報が古いとはどういうことか

統計情報が古いというのは、最新のデータの状態と統計情報の状態が一致していない状況のことを意味します。そして統計情報が最新のデータに追いついていない状態です。

1.例えば、昨日、テーブルを作成します。
  その後、バッチ処理で、1000件のデータが作成されました。
このタイミングで統計情報をすると、統計情報は「1000件のデータが存在する」という状態です。

2.今日、早朝にバッチ処理で、データを3000件追加しました。
  このとき、統計情報を取得しなかったとします。

2の状態では「4000件のデータが存在する」という状態ですが、統計情報は「1000件のデータが存在する」という状態です。

つまり、最新のデータの状態と統計情報の内容が一致していない状態になります。そして統計情報が最新の状態に追いついていないので「統計情報が古い」と呼ばれます。これが統計情報が古いということです。

「統計情報が古い」と何が問題?

SQLは実行するときに、統計情報を基にして最適な実行計画を作って実行されます。

統計情報が古いと適切な実行計画が作られない場合があり、結果的にパフォーマンスの悪化につながることがあります。

実行計画については、「ORACLEのオプティマイザと実行計画について」で詳しく解説していますのでぜひ参考にしてください。

統計情報はいつ発生し、いつ取得されるのか

統計情報が生成されるタイミング

単純にテーブルやインデックスを作成しただけでは中身は空です。

統計情報が取得されるタイミング

これはシステムごとに異なります。

・ORACLEの自動取得している場合
ORACLEで自動で取得する設定のみの場合、深夜に1度取得されます。
このとき、全てのテーブルやインデックスが対象とはなりません。
テーブルやインデックスの更新されたデータの割合が高いものだけが統計情報を取得されます。

例えば、空のテーブルに1日で100万件のデータが登録された場合などは取得されます。
しかし100万件のデータのうち、1件更新されたくらいでは取得対象になりません。

・手動で取得している場合
業務システムの特性を考慮し、バッチ処理などで手動で統計情報を取得する場合はバッチ処理が起動されたタイミングで取得されます。

統計情報の取得方法や取得された日付を確認する方法

統計情報は手動でSQLを実行することで簡単に取得することが出来ます。
詳しくは「【ORACLE】表の統計情報を取得するSQL」で解説していますのでぜひ参考にしてください。

統計情報が取得された日付は記録されていてSQLで簡単に取得できます。
詳しくは「【ORACLE】表の統計情報取得日を確認するSQL」で解説していますのでぜひ参考にしてください。

最後に

最後までお読みいただきありがとうございます。

統計情報が古いとSQLが遅くなることがありますが、SQLが遅くなる原因は他にもあります。
詳しくは「SQLのレスポンスが遅い原因3つ」で解説していますので参考にしてください。

また、SQLのチューニングについても紹介しています。
詳しくは「SELECT文のSQLチューニング方法まとめ」で解説していますので、ぜひ参考にしてください。