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です。