[Oracle] オプティマイザ統計情報を手動収集する | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Oracle 10g ではデフォルトで1日1回オプティマイザ統計情報の自動収集が行われるようジョブがスケジューリングされています。

ゆえに、さほどシビアな性能を要求されないデータベースであれば、オプティマイザ統計情報の収集をデフォルトの設定のまま Oracle に任せておけば十分だと思われます。


しかし、データベースによっては1日1回の自動収集だけでは不十分なケースも考えられます。

通常運用時には問題なくとも、新規に表を作成した時、データを大量に登録・削除した時など、オプティマイザ統計情報が欠落・失効した状態のまま次の自動収集が実行されるまで待っていると、その間の運用に支障が出るというようなことはよくあることです。


このようなときにはオプティマイザ統計情報を手動収集します。


オプティマイザ統計情報の収集には DBMS_STATS.GATHER_XXXXXX_STATS プロシージャを使用します。

ただし、表の監視機能が有効になっている環境(※)では、表単位で個別にオプティマイザ統計情報を収集したり、無差別に全ての表のオプティマイザ統計情報を収集したりするのではなく、'GATHER_AUTO'オプションを付けて、オプティマイザ統計情報が欠落または失効している表に対して一括でオプティマイザ統計情報の収集を実行したほうが簡単で効率的です。

BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS ( 
    ownname => 'schema_name',
    options => 'GATHER AUTO');
END;
/


なお、Oracle では、上記のようなユーザー表のオプティマイザ統計情報のほか、データディクショナリや固定オブジェクトについても統計情報を適宜収集することによって内部動作を最適化することができるとされています。

データディクショナリの統計情報は DBMS_STATS.GATHER_DICTIONARY_STATS プロシージャを使用して収集します。

BEGIN
  DBMS_STATS.GATHER_DICTIONARY_STATS();
END;
/

データディクショナリの統計情報はスキーマの初期構築時など DDL が多く発行された後に収集することが推奨されています。


固定オブジェクトの統計情報は DBMS_STATS.GATHER_FIXED_OBJECTS_STATS プロシージャを使用して収集します。

BEGIN
  DBMS_STATS.GATHER_FIXED_OBJECTS_STATS();
END;
/


固定オブジェクトの統計情報はシステムのワークロードや性質が変更された後に収集することが推奨されています。


いずれもそう頻繁に行うものではありませんが...一応、覚えておいたほうがよさそうです。




【関連エントリ】
[Oracle] オプティマイザ統計情報の収集は基本的にOracle任せでOK
[Oracle] ルールベースオプティマイザの廃止と動的サンプリング
[Oracle] 一時表のオプティマイザ統計情報の収集について
[Oracle] 揮発性の高い表のオプティマイザ統計情報の収集について