OceanBaseデータベースのオプティマイザーでは、統計情報は通常のデータとして内部テーブルに格納され、オプティマイザーによる統計情報へのアクセス速度を向上させるために、ローカルで統計情報キャッシュが維持されます。OceanBaseデータベースV4.0以前のバージョンでは、統計情報の収集は毎日のメジャーコンパクション処理中に完了しますが、毎日のメジャーコンパクションは増分コンパクションであるため、統計情報が常に正確であるとは限りません。また、毎日のメジャーコンパクションではヒストグラム情報を収集できず、データの偏りが存在する場合に対処することができません。そのため、OceanBaseデータベースV4.0以降では、統計情報の収集と毎日のメジャーコンパクションを分離し、毎日のメジャーコンパクション処理中に統計情報を収集しないようになりました。これにより、実行計画も毎日のメジャーコンパクションの影響を受けなくなりました。
統計情報の種類
OceanBaseデータベースのオプティマイザーでは、統計情報は主に4つのカテゴリに分類されます:テーブル統計情報、列統計情報、インデックス統計情報、およびマテリアライズドビューのリフレッシュ統計情報。以下の表に一般的な統計情報の種類を示します。
| 統計情報の分類 | 基本的な統計情報の種類 |
|---|---|
| テーブル統計情報 |
|
| 列統計情報 |
|
| インデックス統計情報 |
|
| マテリアライズドビューのリフレッシュ統計情報 |
|
ヒストグラムとその役割
ヒストグラムは特殊な列統計情報です。デフォルトでは、オプティマイザーは列のデータが均等に分布していると仮定し、この特徴に基づいて行数を推定します。しかし、実際のシナリオでは、ほとんどのテーブルのデータ分布は均等ではないため、オプティマイザーが誤って行数を推定し、最適な実行計画を選択できない場合があります。このような状況では、ヒストグラムが必要になります。ヒストグラムは、データを一連の順序付きバケットに保存することで、その列全体のデータ分布特性を記述します。オプティマイザーはヒストグラムに基づいて、より正確な行数を推定できます。各バケットには以下の情報が含まれます:
現在のバケットに累積されたデータ量(現在のバケットとそれ以前のバケットの合計)。
現在のバケットの終了値。
現在のバケットの終了値の出現頻度。
現在、OceanBaseデータベースのオプティマイザーは、頻度ヒストグラム、TopKヒストグラム、およびハイブリッドヒストグラムの3種類のヒストグラムをサポートしています。オプティマイザーは統計情報を収集する際に、列データの実際の分布状況に応じて適切なヒストグラムタイプを選択します。具体的な戦略は以下の図のとおりです:

図中:
- NDV:列上の異なるvalue値の個数。
- bucket_size:指定されたヒストグラムバケットの数。デフォルトは254です。
- p:Topkヒストグラムの期待される最小パーセンテージしきい値。計算式:
(1–(1/bucket_size)) * 100。デフォルト値254を使用する場合、対応する最小パーセンテージしきい値は99.6です。