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

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