統計情報を取得する「適切なタイミング」を考えよう

EnterpriseZine / 2012年10月11日 0時0分

新しいバージョンのデータベースでは、よりSQL実行時のデータの状態を考慮した実行計画を作成します。そのため、適切な統計情報を取得することが、アップグレード後の性能劣化を起こさないためには重要であると、前回お伝えしました。そこで今回は、統計情報を適切に取得するために、知っておいたほうがよいノウハウをお伝えします。

■統計情報ってどのような情報?

 統計情報ってどのような情報ですか?と聞かれた時、Oracleデータベースでは、具体的にどのような情報を指すか答えられますか?

 統計情報と聞くと、表に格納されたデータの特性や、索引構成に関する情報を思い浮かべる人が多いと思います。しかし、統計情報には、CPU処理速度や、I/O速度などのシステムに関する情報や、V$SQLのような動的パフォーマンス表などの固定オブジェクトに関する情報も含まれます。表や列、索引というオブジェクトに対する統計だけでなく、下記の情報に対しても統計を取得していることを覚えておいてください。

■統計情報を取得しないとどうなるの?

 オラクルでは、どのような情報に対して統計を取得しているか、ご理解いただけたと思います。それでは、これらの統計情報を明示的に取得していない場合は、どのようになるかを考えてみましょう。

● ① オブジェクト統計を収集しなかった場合

 Oracle Database 10g以降のバージョンでは、デフォルトで「自動統計収集」という機能が有効になっているため、設定を変更していない場合は、定期的に統計情報が自動収集されます。

 また、自動統計収集を無効にした場合も、Oracle Database10gR2以降では、「動的サンプリング」という機能がデフォルトで有効になっているため、SQL実行時に統計を取得していない表を検出すると、自動的に統計情報が収集されます。

 このように、新しいバージョンのデータベースでは、より実環境のデータの状態に適した実行計画を作成できるように、統計情報の取得漏れをなくすための仕組みがあります。

 しかし、データの状態により実行計画が変動することを嫌い、敢えて統計情報を取得せずに運用しているシステムをたまにみかけます。

 統計情報を取得していない環境で、自動統計収集も、動的サンプリングも無効にした場合は、デフォルト統計が使用されます。デフォルト統計では、「行の平均の長さは、100バイトとして計算する」など予め決められた値を使用します。しかし、ブロック数のように、実際の値が反映されるものもあるため、テーブルサイズが肥大化すると、デフォルト統計が変動して、実行計画が変わる場合があります。そのため、統計情報を取得しなければ、実行計画が変動しないという考えは間違っています。

  • 前のページ
    • 1
    • 2
  • 次のページ
EnterpriseZine

トピックスRSS

ランキング