コストベースオプティマイザが現在唯一サポートされているオプティマイザであるため、データベース内のすべてのテーブルには統計情報が必要です。これには、すべてのディクショナリテーブル(SYS、SYSTEMなどが所有し、SYSTEMおよびSYSAUX表領域に存在するテーブル)や、動的パフォーマンスビュー(v$)で使用されるx$テーブルも含まれます。

ディクショナリ統計情報

ディクショナリテーブルの統計情報は、夜間のメンテナンスウィンドウで実行される自動統計情報収集タスクによって維持されます。メインのアプリケーションスキーマに対して自動統計情報収集ジョブを無効にすることを選択した場合でも、自動統計情報収集タスクにディクショナリ統計情報の維持を許可することを強くお勧めします。これは、DBMS_STATS.SET_GLOBAL_PREFSプロシージャを使用してAUTOSTATS_TARGETの値をAUTOからORACLEに変更することで行えます。

exec dbms_stats.set_global_prefs('autostats_target','oracle')

固定オブジェクト統計情報

Oracle Database 12c以降、固定オブジェクト統計情報は、以前に収集されていない場合、自動統計情報収集タスクによって収集されます。それ以降、データベースは固定オブジェクト統計情報を自動的には収集しません。他のデータベーステーブルとは異なり、オプティマイザ統計情報が欠落している場合、X$テーブルを含むSQL文に対してダイナミックサンプリングは自動的に使用されません。そのため、統計情報が欠落している場合、オプティマイザは事前定義されたデフォルト値を統計情報として使用します。

これらのデフォルト値は実際の状況を反映しておらず、最適ではない実行計画につながる可能性があり、システムで深刻なパフォーマンス問題を引き起こす恐れがあります。このため、手動で固定オブジェクト統計情報を収集することを強くお勧めします。

固定オブジェクトの統計情報は、DBMS_STATS.GATHER_FIXED_OBJECTS_STATSプロシージャを使用して収集できます。
x$テーブルの一時的な性質上、システム上に代表的なワークロードがある状態で固定オブジェクト統計情報を収集することが重要です。統計情報収集に追加リソースが必要なため、大規模システムでは常に実行可能とは限りません。ピーク負荷時に実行できない場合は、システムが十分に稼働した状態(ウォームアップ後)で、以下の3つの主要なタイプの固定オブジェクトテーブルがデータで埋まっている状態で収集する必要があります:
» 構造データ - 例:データファイル、制御ファイルの内容などをカバーするビュー
» セッションベースのデータ - 例:v$session、v$accessなど
» ワークロードデータ - 例:v$sql、v$sql_planなど

メジャーなデータベースまたはアプリケーションのアップグレード、新しいモジュールの実装、データベース構成の変更を行った場合は、固定オブジェクト統計情報を再収集することをお勧めします。例えば、SGAサイズを増やすと、バッファキャッシュや共有プールに関する情報を含むすべてのx$テーブル(v$buffer_poolやv$shared_pool_adviceで使用されるx$テーブルなど)が大きく変わる可能性があります。

システム統計情報

システム統計情報を有効にすると、文を実行する実際のシステムハードウェアに関する情報(CPU速度やI/Oパフォーマンスなど)を使用して、オプティマイザは実行計画内の各操作のコストをより正確に見積もることができます。

システム統計情報はデフォルトで有効化されており、代表的なデフォルト値で自動的に初期化されます。これらの値はほとんどのシステムにとって代表的です。

まとめ

Oracleオプティマイザが実行計画のコストを正確に判断するためには、SQL文でアクセスされるすべてのオブジェクト(テーブルと索引)に関する正確な統計情報と、そのSQL文が実行されるシステムに関する情報が必要です。

自動統計情報収集タスクと本資料で説明した他の手法を組み合わせて使用することで、DBAは環境に合わせた正確な統計情報セットを維持し、オプティマイザが常に最適な計画を選択するために必要な情報を持っていることを保証できます。統計情報収集戦略を確立した後は、戦略への変更は制御された方法で行い、保留統計情報(pending statistics)などの主要な機能を活用して、アプリケーションパフォーマンスに悪影響を与えないようにする必要があります。