1. 概念の定義
Oracle の統計 (Optimizer Statistics) は次のとおりです。SQL 実行のコストを見積もるためにオプティマイザー (CBO、コストベースのオプティマイザー) によって使用されるメタデータのセット。これはデータベース オブジェクトのデータ分散特性を記述するものであり、ビジネス データそのものと同等ではありません。
オブジェクトの種類ごとに分かれており、主に次の 4 つのカテゴリが含まれます。
| カテゴリ | 主な内容 |
|---|---|
| テーブル統計 | 行数(NUM_ROWS)、データブロック数(BLOCKS)、平均行長(AVG_ROW_LEN)、空ブロック数など。 |
| 列統計 | 異なる値の数(NDV)、Null値の数、選択性(DENSITY)、ヒストグラム |
| インデックス統計 | インデックス レベル (BLEVEL)、リーフ ブロックの数、クラスタリング ファクター (CLUSTERING_FACTOR)、異なるキー値の数 |
| システム統計 | CPU、シングルブロック読み取りおよびマルチブロック読み取りのコスト定数。コストモデルの変換に使用されます。 |
さらに、拡張統計 (複数列相関) や式統計などの補助形式もあります。
2. 機能と適用シナリオ
統計情報は計画を実行するために CBO によって生成されます必須入力その中心的な機能は、オプティマイザに次の 3 つの質問に答えさせることです。
- 返す行数: カーディナリティの推定。
- どのルートが一番安いでしょうか?: フルテーブルスキャン、インデックススキャン、またはインデックスクイックフルスキャン。
- テーブル間の接続方法: 結合順序 (Join Order) と接続方法 (Nested Loop、Hash Join、Merge Join)。
したがって、アクセス パス、接続順序、接続方法、並列処理の選択に直接影響します。重点を置く必要がある一般的なシナリオは次のとおりです。
- 一括インポート、削除、および更新後、データの分布は大幅に変化します。
- 新しく起動された SQL が突然遅くなり、実行計画が異常に変更されます。
- 新しいパーティションをパーティション テーブルに追加し、履歴パーティション データをアーカイブします。
- テーブルのデータは著しく偏っており、複数の列の相関条件があります。
- テスト環境から実稼働環境に移行するには、統計を再利用または再構築する必要があります。
明確にする必要があるのは、統計情報は「オプティマイザにデータがどのように見えるかを理解させるため」であり、「データベースにどのように実行するかを直接伝えるため」ではないということです。
3. 動作メカニズム
- 解析して変換する: SQL 解析後、クエリ変換 (ビューのマージ、サブクエリの拡張、述語のプッシュなど) を実行します。
- カーディナリティの推定: オプティマイザは列統計を使用して選択性を計算します。共通する関係性は、
选择性 ≈ 1 / NDV;ヒストグラムがある場合、偏った分布はバケットによって表されます。複数列の相関条件は拡張統計に依存します。 - コスト計算: テーブル、インデックス統計、システム統計を組み合わせて I/O コストと CPU コストを推定し、各候補プランの COST を取得します。
- プラン選択: 候補プランの中から価格が最も低いプランを選択して、最終的な実行プランを作成し、共有プールにキャッシュします。
- 統計情報の整備: Oracle には、10g 以降、メンテナンス期間内に欠落しているオブジェクトまたは期限切れのオブジェクトに関する統計情報を収集するための自動統計収集タスクが組み込まれています。 Oracle 19c では、通常の DML プロセスの最も基本的な統計情報を補足し、オプティマイザが古い統計情報によって誤解されるリスクを軽減するために、リアルタイム統計 (Real-Time Statistics) も導入されていますが、自動収集タスクを置き換えることはできません。
- 期限切れ判定: DML によって変更されたオブジェクトの行数が総行数の約 10% を超えると、通常、期限切れ (STALE) としてマークされます。
4. 関連オブジェクトと見学入り口
関連するシステムビュー
| ビュー名 | 使用 | このコンセプトとの関連性 |
|---|---|---|
| DBA_TAB_STATISTICS | すべてのテーブルのオプティマイザ統計を表示する | テーブルレベルの統計、STALE_STATS、LAST_ANALYZED、およびロックステータスを表示します。 |
| DBA_TAB_COL_STATISTICS | 列統計とヒストグラムの概要 | NDV、DENSITY、ヒストグラムバケット番号を確認します |
| DBA_IND_STATISTICS | インデックスオプティマイザーの統計 | BLEVEL、リーフ ブロック、クラスタリング ファクターを表示する |
| DBA_TAB_HISTOGRAMS | テーブルの列ヒストグラムの詳細 | スキュー列の分布記述が妥当かどうかを判断する |
| DBA_OPTSTAT_OPERATIONS | 統計操作履歴 | スキーマおよびデータベースレベルの収集操作レコードの表示 |
| DBA_OPTSTAT_OPERATION_TASKS | 統計収集タスクの詳細 | 同時収集タスクの実行を観察する |
| DBA_SCHEDULER_JOBS | ジョブ情報のスケジュール設定 | 自動統計収集タスクが存在し、有効になっているかどうかを確認します。 |
その他の展望入口
- DBMS_STATS パッケージ: GATHER_TABLE_STATS、GATHER_SCHEMA_STATS、GATHER_DATABASE_STATS、LOCK_TABLE_STATS、RESTORE_TABLE_STATS、PUBLISH_PENDING_STATS などのインポート統計を収集、削除、ロック、リカバリ、エクスポートするためのメイン インターフェイス。
- 実行計画: 実行プランの行、コスト、カーディナリティは統計情報の推定に直接対応し、統計情報が歪んでいないかを逆検証するために使用できます。
- オプティマイザの動的サンプリングパラメータ
optimizer_dynamic_sampling注: 統計情報が欠落している場合、オプティマイザは解析フェーズ中に小規模なサンプリング推定を行うことができます。 - 10053イベント:オプティマイザのコスト計算とプラン選択の過程を出力できます。
これらの統計を「使用」する方法
実際には、通常、次の 5 つの方向から使用されます。
- 統計を最新の状態に保つ: 自動収集タスクが正常に実行されていることを確認し、代替手段がない場合は直接シャットダウンしないでください。大きなテーブルや特殊なテーブルは、オンデマンドで手動で収集できます。
- 収集時のコストと品質の管理: サンプリング率、並列処理、ヒストグラム戦略、コレクション インデックスをカスケードするかどうかなどのパラメーターを通じて、精度とリソース消費のバランスをとります。
- 有効期限ステータスを定期的に確認する処置: STALE_STATS と LAST_ANALYZED の組み合わせを使用して、オブジェクト統計がまだ利用可能かどうかを判断します。例えば:
SELECT owner, table_name, partition_name, stale_stats, last_analyzed
FROM dba_tab_statistics
WHERE table_name = UPPER('&table_name');
- 安定したオブジェクトのロック統計: 自動タスクによる繰り返しの収集を避けるために、データが基本的に変更されないアーカイブ テーブルおよび履歴テーブルの統計をロックします。アップデートが必要な場合は、最初にロックを解除してください。
- 変更を加える前に逃げ道を残しておきます: 重要なテーブルの統計情報を収集や構造調整の前にバックアップし、計画に異常がある場合はリカバリ機能を使用してロールバックします。保留中の統計を使用して公開前に検証することもできます。
- 特別配布補足情報: 歪んだ列にはヒストグラムを使用し、複数列関連の条件には拡張統計を使用します。増分統計は、パーティション化された大きなテーブルに対して有効にすることができます。
- 統計が解決できない場合: SQL 計画管理と協力して実行計画を修正または進化させ、計画の繰り返しの変動を回避します。
5. よくある誤解と境界線
- 「統計情報が正確であれば、実行計画は最適になります。」:未確立。計画は、コスト モデル、バインド変数スヌーピング、パラメーター設定、並列処理、メモリ構成などにも影響されます。
- 「サンプリング率が高いほど良い」: 大きなテーブルの 100% サンプリングは非常にコストがかかります。均等に分散されたテーブルの場合は、合理的なサンプリングで十分です。重要なのは、分布特性が正しく記述されているかどうかです。
- 「実行計画が変更される場合、それは統計情報の問題に違いありません。」注:カーソルの障害、バインド変数、パラメータの変更、バージョンのアップグレード、インデックスの変更により計画が変更される可能性があり、実行計画の履歴とAWRに基づいて判断する必要があります。
- 「ANALYZE TABLE を使用して統計を収集する」: Oracle では DBMS_STATS の使用を推奨しています。ANALYZE は主に構造検証に使用され、統計情報の収集には制限があります。
- 「ロック後に統計を自動的に更新できます」: ロックすると自動収集が妨げられるため、最初にロックを解除する必要があります。
- 「統計情報を収集した後、古いカーソルは新しい統計をすぐに使用する必要があります。」注: キャッシュされたカーソルが直ちに無効化されるかどうかは、NO_INVALIDATE などのパラメーターに関連します。そうでない場合は、古いプランが引き続き使用される可能性があります。
- 「DBMS_STATS はすべての情報を収集します」: たとえば、行移行/リンク数 (CHAIN_CNT) は収集されず、ANALYZE の LIST CHAINED ROWS を使用する必要があります。
- 「統計を削除すると、スケジュールの問題を解決できる可能性があります」注:削除後、オプティマイザは動的サンプリングまたはデフォルト推定に切り替わる場合があります。結果が改善されない可能性があり、日常的な方法として使用することはできません。
- ヒストグラムには境界がある: バケット数の上限は 254 です。不適切な列のヒストグラムを作成すると、オプティマイザが誤解を招く可能性があります。
6. 知識を広げる
- 動的サンプリング: 統計情報が欠落している場合、オプティマイザによって一時的にサンプリングされ、推定されます。レベル 0 はオフを意味します。レベルが高くなるほど、サンプリング ブロックの数は増えますが、解析のオーバーヘッドも大きくなります。
- リアルタイム統計: 19c 以降、基本的な統計は DML プロセスで維持されます。これは自動収集を補足するものです。
- 保留中の統計と統計の回復:正式リリース前に統計情報の変更による影響を検証したり、例外が発生した場合に迅速にロールバックするために使用されます。
- 増分統計: パーティション化されたテーブルの場合、テーブル全体の再収集のオーバーヘッドを削減します。
- 拡張統計: 複数の列間の相関関係を記述し、複数列の等価性と範囲条件のカーディナリティ推定を改善します。
- SQL計画管理: 統計情報の変更により計画が不安定になった場合に、実行計画を修正または進化させるために使用されます。