メインコンテンツまでスキップ

CBO の統計収集

このトピックでは、CelerData CBO の基本概念と CBO のための統計収集方法について説明します。CelerData は、正確なデータ分布統計を収集するためにヒストグラムを導入しています。

CBO とは

コストベースオプティマイザ (CBO) は、クエリ最適化において重要です。SQL クエリが CelerData に到着すると、論理実行計画に解析されます。CBO は論理計画を複数の物理実行計画に書き換え、変換します。CBO はその後、計画内の各 Operator の実行コスト(CPU、メモリ、ネットワーク、I/O など)を推定し、最もコストの低いクエリパスを最終的な物理計画として選択します。

CelerData CBO はデフォルトで有効になっています。Cascades フレームワークに基づいて開発された CelerData CBO は、さまざまな統計情報に基づいてコストを推定します。数万の実行計画の中から最もコストの低い実行計画を選択することができ、複雑なクエリの効率とパフォーマンスを大幅に向上させます。

統計は CBO にとって重要です。これらはコスト推定が正確で有用であるかどうかを決定します。以下のセクションでは、統計情報の種類、収集ポリシー、および統計の収集方法と統計情報の表示方法について詳しく説明します。

統計情報の種類

CelerData は、コスト推定の入力としてさまざまな統計を収集します。

基本統計

デフォルトで、CelerData はテーブルとカラムの以下の基本統計を定期的に収集します。

  • row_count: テーブル内の総行数
  • data_size: カラムのデータサイズ
  • ndv: カラムのカーディナリティ、つまりカラム内の異なる値の数
  • null_count: カラム内の NULL 値を持つデータの量
  • min: カラム内の最小値
  • max: カラム内の最大値

基本統計は _statistics_.table_statistic_v1 テーブルに保存されます。このテーブルは、CelerData クラスターの _statistics_ データベースで確認できます。

ヒストグラム

CelerData は、基本統計を補完するためにヒストグラムを導入しています。ヒストグラムは、データ表現の効果的な方法と考えられています。データが偏っているテーブルに対して、ヒストグラムはデータ分布を正確に反映することができます。

CelerData は等高ヒストグラムを使用しており、いくつかのバケットで構成されています。各バケットには同量のデータが含まれています。頻繁にクエリされ、選択性に大きな影響を与えるデータ値に対して、CelerData はそれらのために個別のバケットを割り当てます。バケットが多いほど推定が正確になりますが、メモリ使用量がわずかに増加する可能性があります。ヒストグラム収集タスクのためにバケット数と最も一般的な値(MCV)を調整できます。

ヒストグラムは、データが非常に偏っており、頻繁にクエリされるカラムに適用されます。テーブルデータが均一に分布している場合、ヒストグラムを作成する必要はありません。ヒストグラムは、数値、DATE、DATETIME、または文字列型のカラムにのみ作成できます。

現在、CelerData はヒストグラムの手動収集のみをサポートしています。ヒストグラムは _statistics_.histogram_statistics テーブルに保存されます。

収集タイプと方法

テーブル内のデータサイズとデータ分布は常に変化しています。統計はデータの変化を表すために定期的に更新する必要があります。統計収集タスクを作成する前に、ビジネス要件に最も適した収集タイプと方法を選択する必要があります。

CelerData は、フル収集とサンプル収集の両方をサポートしており、自動および手動で実行できます。デフォルトでは、CelerData はテーブルのフル統計を自動的に収集します。5 分ごとにデータの更新を確認します。データの変更が検出されると、データ収集が自動的にトリガーされます。自動フル収集を使用したくない場合は、FE 設定項目 enable_collect_full_statisticfalse に設定し、収集タスクをカスタマイズできます。

収集タイプ収集方法説明利点と欠点
フル収集自動/手動テーブル全体をスキャンして統計を収集します。統計はパーティションごとに収集されます。パーティションにデータの変更がない場合、このパーティションからデータは収集されず、リソース消費が削減されます。フル統計は _statistics_.column_statistics テーブルに保存されます。利点: 統計が正確であり、CBO が正確な推定を行うのに役立ちます。欠点: システムリソースを消費し、遅いです。
サンプル収集自動/手動テーブルの各パーティションから N 行のデータを均等に抽出します。統計はテーブルごとに収集されます。各カラムの基本統計は 1 レコードとして保存されます。カラムのカーディナリティ情報(ndv)は、サンプルデータに基づいて推定され、正確ではありません。サンプル統計は _statistics_.table_statistic_v1 テーブルに保存されます。利点: システムリソースを消費せず、速いです。欠点: 統計が完全ではなく、コスト推定の正確性に影響を与える可能性があります。

統計の収集

CelerData は柔軟な統計収集方法を提供しています。自動、手動、またはカスタム収集のいずれかを選択し、ビジネスシナリオに最適な方法を選択できます。

自動フル収集

基本統計については、CelerData はデフォルトでテーブルのフル統計を自動的に収集し、手動操作を必要としません。統計が収集されていないテーブルについては、CelerData はスケジューリング期間内に自動的に統計を収集します。統計が収集されたテーブルについては、CelerData はテーブル内の総行数と変更された行数を更新し、定期的にこの情報を保持して自動収集をトリガーするかどうかを判断します。

自動収集をトリガーする条件:

  • 前回の統計収集以降、テーブルデータが変更されました。
  • テーブル統計の健康状態が指定されたしきい値(statistic_auto_collect_ratio)を下回っています。

統計の健康状態を計算するための式: 1 - 前回の統計収集以降に追加された行数/最小パーティションの総行数

  • パーティションデータが変更されました。データが変更されていないパーティションは再収集されません。

自動フル収集はデフォルトで有効になっており、システムがデフォルト設定を使用して実行します。

以下の表はデフォルト設定を示しています。これらを変更する必要がある場合は、ADMIN SET CONFIG コマンドを実行してください。

FE 設定項目タイプデフォルト値説明
enable_statistic_collectBOOLEANTRUE統計を収集するかどうか。このスイッチはデフォルトでオンになっています。
enable_collect_full_statisticBOOLEANTRUE自動フル収集を有効にするかどうか。このスイッチはデフォルトでオンになっています。
statistic_collect_interval_secLONG300自動収集中にデータ更新を確認する間隔。単位: 秒。
statistic_auto_collect_ratioFLOAT0.8自動収集のための統計が健康であるかどうかを判断するためのしきい値。統計の健康状態がこのしきい値を下回る場合、自動収集がトリガーされます。
statistics_max_full_collect_data_sizeINT100自動収集のためにデータを収集する最大パーティションのサイズ。単位: GB。パーティションがこの値を超える場合、フル収集は破棄され、サンプル収集が代わりに実行されます。

統計収集の大部分は自動ジョブに依存できますが、特定の統計要件がある場合は、ANALYZE TABLE ステートメントを実行して手動でタスクを作成するか、CREATE ANALYZE ステートメントを実行して自動タスクをカスタマイズできます。

手動収集

ANALYZE TABLE を使用して手動収集タスクを作成できます。デフォルトでは、手動収集は同期操作です。非同期操作に設定することもできます。非同期モードでは、このコマンドを実行した後、ANALYZE TABLE の実行結果がすぐに返されます。ただし、収集タスクはバックグラウンドで実行され、結果を待つ必要はありません。非同期収集は大規模なデータ量を持つテーブルに適しており、同期収集は小規模なデータ量を持つテーブルに適しています。手動収集タスクは作成後に 1 回のみ実行されます。手動収集タスクを削除する必要はありません。 SHOW ANALYZE STATUS を実行してタスクのステータスを確認できます。

基本統計を手動で収集

ANALYZE [FULL|SAMPLE] TABLE tbl_name (col_name [,col_name])
[WITH SYNC | ASYNC MODE]
PROPERTIES (property [,property]);

パラメータの説明:

  • 収集タイプ
    • FULL: フル収集を示します。
    • SAMPLE: サンプル収集を示します。
    • 収集タイプが指定されていない場合、デフォルトでフル収集が使用されます。
  • col_name: 統計を収集するカラム。複数のカラムはカンマ (;) で区切ります。このパラメータが指定されていない場合、テーブル全体が収集されます。
  • PROPERTIES: カスタムパラメータ。PROPERTIES が指定されていない場合、デフォルト設定が使用されます。
PROPERTIESタイプデフォルト値説明
statistic_sample_collect_rowsINT200000サンプル収集のために収集する最小行数。このパラメータ値がテーブルの実際の行数を超える場合、フル収集が実行されます。

手動フル収集

-- デフォルト設定を使用してテーブルのフル統計を手動で収集します。
ANALYZE TABLE tbl_name;

-- デフォルト設定を使用してテーブルのフル統計を手動で収集します。
ANALYZE FULL TABLE tbl_name;

-- デフォルト設定を使用してテーブル内の指定されたカラムの統計を手動で収集します。
ANALYZE TABLE tbl_name(c1, c2, c3);

手動サンプル収集

-- デフォルト設定を使用してテーブルの部分統計を手動で収集します。
ANALYZE SAMPLE TABLE tbl_name;

-- 収集する行数を指定して、テーブル内の指定されたカラムの統計を手動で収集します。
ANALYZE SAMPLE TABLE tbl_name (v1, v2, v3) PROPERTIES(
"statistic_sample_collect_rows" = "1000000"
);

ヒストグラムを手動で収集

ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON col_name [, col_name]
[WITH SYNC | ASYNC MODE]
[WITH N BUCKETS]
PROPERTIES (property [,property]);

パラメータの説明:

  • col_name: 統計を収集するカラム。複数のカラムはカンマ (;) で区切ります。このパラメータが指定されていない場合、テーブル全体が収集されます。ヒストグラムにはこのパラメータが必要です。
  • WITH N BUCKETS: ヒストグラム収集のためのバケット数 N。指定されていない場合、fe.conf のデフォルト値が使用されます。
  • PROPERTIES: カスタムパラメータ。PROPERTIES が指定されていない場合、デフォルト設定が使用されます。
PROPERTIESタイプデフォルト値説明
statistic_sample_collect_rowsINT200000収集する最小行数。このパラメータ値がテーブルの実際の行数を超える場合、フル収集が実行されます。
histogram_buckets_sizeLONG64ヒストグラムのデフォルトバケット数。
histogram_mcv_sizeINT100ヒストグラムの最も一般的な値 (MVC) の数。
histogram_sample_ratioFLOAT0.1ヒストグラムのサンプリング比率。
histogram_max_sample_row_countLONG10000000ヒストグラムのために収集する最大行数。

ヒストグラムのために収集する行数は、複数のパラメータによって制御されます。それは statistic_sample_collect_rows とテーブル行数 * histogram_sample_ratio の間の大きい値です。この数は histogram_max_sample_row_count で指定された値を超えることはできません。値が超えた場合、histogram_max_sample_row_count が優先されます。

実際に使用されるプロパティは、SHOW ANALYZE STATUS の出力の Properties 列で確認できます。

-- デフォルト設定を使用して v1 のヒストグラムを手動で収集します。
ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON v1;

-- 32 バケット、32 MCV、および 50% のサンプリング比率で v1 と v2 のヒストグラムを手動で収集します。
ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON v1,v2 WITH 32 BUCKETS
PROPERTIES(
"histogram_mcv_size" = "32",
"histogram_sample_ratio" = "0.5"
);

カスタム収集

自動収集タスクをカスタマイズ

CREATE ANALYZE ステートメントを使用して、自動収集タスクをカスタマイズできます。

カスタム自動収集タスクを作成する前に、自動フル収集を無効にする必要があります(enable_collect_full_statistic = false)。そうしないと、カスタムタスクは有効になりません。

-- すべてのデータベースの統計を自動的に収集します。
CREATE ANALYZE [FULL|SAMPLE] ALL PROPERTIES (property [,property]);

-- データベース内のすべてのテーブルの統計を自動的に収集します。
CREATE ANALYZE [FULL|SAMPLE] DATABASE db_name
PROPERTIES (property [,property]);

-- 指定されたカラムの統計を自動的に収集します。
CREATE ANALYZE [FULL|SAMPLE] TABLE tbl_name (col_name [,col_name])
PROPERTIES (property [,property]);

パラメータの説明:

  • 収集タイプ
    • FULL: フル収集を示します。
    • SAMPLE: サンプル収集を示します。
    • 収集タイプが指定されていない場合、デフォルトでフル収集が使用されます。
  • col_name: 統計を収集するカラム。複数のカラムはカンマ (;) で区切ります。このパラメータが指定されていない場合、テーブル全体が収集されます。
  • PROPERTIES: カスタムパラメータ。PROPERTIES が指定されていない場合、デフォルト設定が使用されます。
PROPERTIESタイプデフォルト値説明
statistic_auto_collect_ratioFLOAT0.8自動収集のための統計が健康であるかどうかを判断するためのしきい値。統計の健康状態がこのしきい値を下回る場合、自動収集がトリガーされます。
statistics_max_full_collect_data_sizeINT100自動収集のためにデータを収集する最大パーティションのサイズ。単位: GB。パーティションがこの値を超える場合、フル収集は破棄され、サンプル収集が代わりに実行されます。
statistic_sample_collect_rowsINT200000収集する最小行数。このパラメータ値がテーブルの実際の行数を超える場合、フル収集が実行されます。

自動フル収集

-- すべてのデータベースのフル統計を自動的に収集します。
CREATE ANALYZE ALL;

-- データベースのフル統計を自動的に収集します。
CREATE ANALYZE DATABASE db_name;

-- データベース内のすべてのテーブルのフル統計を自動的に収集します。
CREATE ANALYZE FULL DATABASE db_name;

-- 指定されたカラムのフル統計を自動的に収集します。
CREATE ANALYZE TABLE tbl_name(c1, c2, c3);

自動サンプル収集

-- デフォルト設定を使用してデータベース内のすべてのテーブルの統計を自動的に収集します。
CREATE ANALYZE SAMPLE DATABASE db_name;

-- 統計の健康状態と収集する行数を指定して、指定されたカラムの統計を自動的に収集します。
CREATE ANALYZE SAMPLE TABLE tbl_name(c1, c2, c3) PROPERTIES(
"statistic_auto_collect_ratio" = "0.5",
"statistic_sample_collect_rows" = "1000000"
);

カスタム収集タスクの表示

SHOW ANALYZE JOB [WHERE predicate]

WHERE 句を使用して結果をフィルタリングできます。このステートメントは、以下のカラムを返します。

カラム説明
Id収集タスクの ID。
Databaseデータベース名。
Tableテーブル名。
Columnsカラム名。
Type統計のタイプ。FULLSAMPLE を含みます。
Scheduleスケジューリングのタイプ。自動タスクの場合は SCHEDULE です。
Propertiesカスタムパラメータ。
Statusタスクのステータス。PENDING、RUNNING、SUCCESS、FAILED を含みます。
LastWorkTime最後の収集時間。
Reasonタスクが失敗した理由。タスクの実行が成功した場合は NULL が返されます。

-- すべてのカスタム収集タスクを表示します。
SHOW ANALYZE JOB

-- データベース `test` のカスタム収集タスクを表示します。
SHOW ANALYZE JOB where `database` = 'test';

カスタム収集タスクの削除

DROP ANALYZE <ID>;

タスク ID は、SHOW ANALYZE JOB ステートメントを使用して取得できます。

DROP ANALYZE 266030;

収集タスクのステータスを表示

SHOW ANALYZE STATUS ステートメントを実行して、すべての現在のタスクのステータスを表示できます。このステートメントは、カスタム収集タスクのステータスを表示するために使用することはできません。カスタム収集タスクのステータスを表示するには、SHOW ANALYZE JOB を使用してください。

SHOW ANALYZE STATUS [WHERE predicate];

LIKE または WHERE を使用して返す情報をフィルタリングできます。

このステートメントは、以下のカラムを返します。

リスト名説明
Id収集タスクの ID。
Databaseデータベース名。
Tableテーブル名。
Columnsカラム名。
Type統計のタイプ。FULL、SAMPLE、HISTOGRAM を含みます。
Scheduleスケジューリングのタイプ。ONCE は手動、SCHEDULE は自動を意味します。
Statusタスクのステータス。
StartTimeタスクの実行開始時間。
EndTimeタスクの実行終了時間。
Propertiesカスタムパラメータ。
Reasonタスクが失敗した理由。実行が成功した場合は NULL が返されます。

統計の表示

基本統計のメタデータを表示

SHOW STATS META [WHERE];

このステートメントは、以下のカラムを返します。

カラム説明
Databaseデータベース名。
Tableテーブル名。
Columnsカラム名。
Type統計のタイプ。FULL はフル収集、SAMPLE はサンプル収集を意味します。
UpdateTime現在のテーブルの最新の統計更新時間。
Propertiesカスタムパラメータ。
Healthy統計情報の健康状態。

ヒストグラムのメタデータを表示

SHOW HISTOGRAM META [WHERE];

このステートメントは、以下のカラムを返します。

カラム説明
Databaseデータベース名。
Tableテーブル名。
Columnカラム。
Type統計のタイプ。ヒストグラムの場合は HISTOGRAM です。
UpdateTime現在のテーブルの最新の統計更新時間。
Propertiesカスタムパラメータ。

統計の削除

不要な統計情報を削除できます。統計を削除すると、統計のデータとメタデータ、および期限切れキャッシュ内の統計が削除されます。自動収集タスクが進行中の場合、以前に削除された統計が再度収集される可能性があることに注意してください。収集タスクの履歴を表示するには、SHOW ANALYZE STATUS を使用できます。

基本統計の削除

DROP STATS tbl_name

ヒストグラムの削除

ANALYZE TABLE tbl_name DROP HISTOGRAM ON col_name [, col_name];

収集タスクのキャンセル

KILL ANALYZE ステートメントを使用して、実行中の 収集タスクをキャンセルできます。手動およびカスタムタスクを含みます。

KILL ANALYZE <ID>;

手動収集タスクのタスク ID は SHOW ANALYZE STATUS から取得できます。カスタム収集タスクのタスク ID は SHOW ANALYZE SHOW ANALYZE JOB から取得できます。

FE 設定項目

FE 設定項目タイプデフォルト値説明
enable_statistic_collectBOOLEANTRUE統計を収集するかどうか。このパラメータはデフォルトでオンになっています。
enable_collect_full_statisticBOOLEANTRUE自動フル統計収集を有効にするかどうか。このパラメータはデフォルトでオンになっています。
statistic_auto_collect_ratioFLOAT0.8自動収集のための統計が健康であるかどうかを判断するためのしきい値。統計の健康状態がこのしきい値を下回る場合、自動収集がトリガーされます。
statistic_max_full_collect_data_sizeLONG100自動収集のためにデータを収集する最大パーティションのサイズ。単位: GB。パーティションがこの値を超える場合、フル収集は破棄され、サンプル収集が代わりに実行されます。
statistic_collect_interval_secLONG300自動収集中にデータ更新を確認する間隔。単位: 秒。
statistic_sample_collect_rowsLONG200000サンプル収集のために収集する最小行数。このパラメータ値がテーブルの実際の行数を超える場合、フル収集が実行されます。
statistic_collect_concurrencyINT3並行して実行できる手動収集タスクの最大数。デフォルト値は 3 で、最大 3 つの手動収集タスクを並行して実行できます。この値を超えると、受信タスクは PENDING 状態になり、スケジュールを待ちます。
histogram_buckets_sizeLONG64ヒストグラムのデフォルトバケット数。
histogram_mcv_sizeLONG100ヒストグラムの最も一般的な値 (MVC) の数。
histogram_sample_ratioFLOAT0.1ヒストグラムのサンプリング比率。
histogram_max_sample_row_countLONG10000000ヒストグラムのために収集する最大行数。
statistic_manager_sleep_time_secLONG60メタデータがスケジュールされる間隔。単位: 秒。システムはこの間隔に基づいて以下の操作を実行します: 統計を保存するためのテーブルを作成します。削除された統計を削除します。期限切れの統計を削除します。
statistic_analyze_status_keep_secondLONG259200収集タスクの履歴を保持する期間。デフォルト値は 3 日です。単位: 秒。

参考文献