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

Gather CBO statistics

CBOの統計情報の収集

このトピックでは、StarRocksのCBO(コストベースの最適化)の基本的な概念と、CBOの統計情報の収集方法について説明します。StarRocks 2.4では、正確なデータ分布統計を収集するためにヒストグラムが導入されています。

CBOとは​

コストベースの最適化(CBO)は、クエリの最適化において重要な役割を果たします。SQLクエリがStarRocksに到着すると、まず論理的な実行計画にパースされます。CBOは、論理プランを複数の物理実行計画に書き換えて変換します。CBOは、プラン内の各オペレータ(CPU、メモリ、ネットワーク、I/Oなど)の実行コストを推定し、最もコストの低いクエリパスを最終的な物理計画として選択します。

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

統計情報はCBOにとって重要です。統計情報が正確で有用かどうかは、コストの推定精度に影響します。以下のセクションでは、統計情報の種類、収集方針、および統計情報の収集方法と表示方法について詳しく説明します。

統計情報の種類​

StarRocksは、コストの推定に必要なさまざまな統計情報を収集します。

基本統計情報​

デフォルトで、StarRocksはテーブルと列の次の基本統計情報を定期的に収集します。

  • row_count:テーブル内の行数の合計
  • data_size:列のデータサイズ
  • ndv:列の基数、つまり列内の一意の値の数
  • null_count:列内のNULL値のデータの量
  • min:列内の最小値
  • max:列内の最大値

基本統計情報は、_statistics_.table_statistic_v1テーブルに保存されます。StarRocksクラスタの_statistics_データベース内でこのテーブルを表示できます。

ヒストグラム​

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

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

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

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

収集タイプと方法​

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

StarRocksでは、フル収集とサンプル収集の両方を自動的および手動でサポートしています。デフォルトでは、StarRocksはテーブルの完全な統計情報を自動的に収集します。データの変更を5分ごとにチェックします。データの変更が検出されると、データ収集が自動的にトリガされます。自動フル収集を使用しない場合は、FEの設定項目enable_collect_full_statisticをfalseに設定し、カスタム収集タスクをカスタマイズすることもできます。

収集タイプ

収集方法

説明

利点とデメリット

フル収集

自動/手動

テーブルのフルスキャンを行い、統計情報を収集します。統計情報はパーティションごとに収集されます。パーティションにデータの変更がない場合、そのパーティションからデータは収集されず、リソースの消費を減らすことができます。フルの統計情報は_statistics_.column_statisticsテーブルに保存されます。

利点:統計情報が正確であり、CBOの正確な推定をサポートします。デメリット:システムリソースを消費し、遅いです。2.5以降、StarRocksは自動収集タスクの実行期間を指定できるようになり、リソース消費を削減できます。

サンプル収集

自動/手動

テーブルの各パーティションから均等にN行のデータを抽出します。統計情報はテーブルごとに収集され、各列の基本統計情報が1つのレコードとして保存されます。列の基数情報(ndv)は、サンプルデータを基に推定されますが、正確ではありません。サンプルの統計情報は_statistics_.table_statistic_v1テーブルに保存されます。

利点:システムリソースを消費せず、高速です。デメリット:統計情報が不完全であるため、コスト推定の正確性に影響を与える可能性があります。

統計情報の収集​

StarRocksでは、柔軟な統計情報の収集方法が提供されています。ビジネスシナリオに応じて、自動、手動、またはカスタムの収集方法を選択できます。

自動フル収集​

基本統計情報については、デフォルトでStarRocksが自動的にテーブルのフル統計情報を収集します。フル統計情報が収集されていないテーブルでは、StarRocksは指定した収集期間内に自動的に統計情報を収集します。フル統計情報が収集されたテーブルでは、StarRocksはテーブル内の総行数と変更された行数を更新し、この情報を定期的に永続化して自動収集をトリガするかどうかを判断します。

2.5以降、StarRocksでは、自動フル収集のための収集期間を指定することができるようになり、自動フル収集によるクラスタのパフォーマンスのジッターを防ぐことができます。この期間は、FEパラメータstatistic_auto_analyze_start_timeおよびstatistic_auto_analyze_end_timeで指定します。

以下の条件が自動収集をトリガします。

  • 前回の統計情報収集以降、テーブルのデータが変更された場合。
  • 統計情報の健全性が指定されたしきい値(statistic_auto_collect_ratio)未満の場合。

統計情報の健全性の計算式:1 - 前回の統計情報収集以降に追加された行数/最小のパーティションの総行数

  • パーティションのデータが変更された場合。データが変更されていないパーティションは再び収集されません。
  • 収集時間が設定された収集期間内にある場合(デフォルトの収集期間は一日中です)。

自動フル収集はデフォルトで有効になっており、システムによって実行されるデフォルトの設定で実行されます。

次の表に、デフォルトの設定について説明します。変更する必要がある場合は、ADMIN SET CONFIGコマンドを実行してください。

FE設定項目

タイプ

デフォルト値

説明

enable_statistic_collect

BOOLEAN

TRUE

統計情報の収集を実行するかどうかを示します。デフォルトでは、この設定はONになっています。

enable_collect_full_statistic

BOOLEAN

TRUE

自動フル収集を有効にするかどうかを示します。デフォルトでは、この設定はONになっています。

statistic_collect_interval_sec

LONG

300

自動収集の間隔です。デフォルトの時間単位は秒です。

statistic_auto_collect_ratio

FLOAT

0.8

自動収集の統計情報が健全かどうかを判断するためのしきい値です。統計情報の健全性がこのしきい値を下回ると、自動収集がトリガされます。

statistic_max_full_collect_data_size

LONG

107374182400

自動収集でデータを収集する最大パーティションサイズです。単位はバイトです。パーティションがこの値を超える場合、フル収集は破棄され、代わりにサンプル収集が実行されます。

statistic_collect_max_row_count_per_query

INT

5000000000

単一の解析タスクに対してクエリする最大行数です。この値を超える場合、解析タスクは複数のクエリに分割されます。

statistic_auto_analyze_start_time

STRING

00:00:00

自動収集の開始時刻です。値の範囲は00:00:00 〜 23:59:59です。

statistic_auto_analyze_end_time

STRING

23:59:59

自動収集の終了時刻です。値の範囲は00:00:00 〜 23:59:59です。

ほとんどの統計情報の収集には自動的なジョブを頼りにすることができますが、特定の統計要件がある場合は、ANALYZE TABLEステートメントを実行してマニュアルなタスクを作成するか、CREATE ANALYZEステートメントを実行してカスタムな自動タスクをカスタマイズすることができます。

マニュアル収集​

ANALYZE TABLEステートメントを使用して、マニュアルな収集タスクを作成することができます。デフォルトでは、マニュアル収集は同期的な操作ですが、非同期で実行するように設定することもできます。非同期モードでは、ANALYZE TABLEを実行した後、システムはこのステートメントが成功したかどうかをすぐに返します。ただし、収集タスクはバックグラウンドで実行され、結果を待つ必要はありません。タスクのステータスは、SHOW ANALYZE STATUSを実行して確認することができます。大量のデータを含むテーブルには非同期収集が適しており、小規模なデータを含むテーブルには同期収集が適しています。マニュアルな収集タスクは作成後に一度だけ実行されますので、マニュアルな収集タスクを削除する必要はありません。

基本統計情報のマニュアルな収集​

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

パラメータの説明:

  • 収集タイプ
    • FULL:フル収集を指定します。
    • SAMPLE:サンプル収集を指定します。
    • 収集タイプが指定されていない場合、デフォルトでフル収集が使用されます。
  • col_name:統計情報を収集する列。複数の列はカンマ(,)で区切ります。このパラメータを指定しない場合、テーブル全体が収集されます。
  • [WITH SYNC | ASYNC MODE]:マニュアルな収集タスクを同期的または非同期的に実行するかどうかを指定します。指定しない場合、同期収集がデフォルトとして使用されます。
  • PROPERTIES:カスタムパラメータ。 PROPERTIESが指定されていない場合、fe.confファイルのデフォルト設定が使用されます。実際に使用されるプロパティは、SHOW ANALYZE STATUSの出力のProperties列で確認できます。

PROPERTIES

タイプ

デフォルト値

説明

statistic_sample_collect_rows

INT

200000

サンプル収集用の最小行数です。パラメータ値がテーブル内の実際の行数を超える場合、フル収集が実行されます。

例

マニュアルなフル収集

-- デフォルトの設定でテーブルのフル統計情報をマニュアルで収集します。
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 SYNC | ASYNC MODE]:マニュアルな収集タスクを同期的または非同期的に実行するかどうかを指定します。指定しない場合、同期収集がデフォルトとして使用されます。
  • WITH N BUCKETS:Nはヒストグラムのバケット数です。指定しない場合、fe.confのデフォルト値が使用されます。
  • PROPERTIES:カスタムパラメータ。 PROPERTIESが指定されていない場合、fe.confのデフォルト設定が使用されます。

PROPERTIES

タイプ

デフォルト値

説明

statistic_sample_collect_rows

INT

200000

収集する最小行数です。パラメータ値がテーブル内の実際の行数を超える場合、フル収集が行われます。

histogram_buckets_size

LONG

64

ヒストグラムのデフォルトのバケット数。

histogram_mcv_size

INT

100

ヒストグラムの最頻値(MCV)の数。

histogram_sample_ratio

FLOAT

0.1

ヒストグラムのサンプリング比率。

histogram_max_sample_row_count

LONG

10000000

ヒストグラムの収集に使用する行の最大数。

ヒストグラムの収集のために収集する行数は、複数のパラメータによって制御されます。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;

-- v1とv2のヒストグラムを指定したバケット数32、MCVサイズ32、サンプリング比率50%で収集します。
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が指定されていない場合、fe.confのデフォルト設定が使用されます。

PROPERTIES

タイプ

デフォルト値

説明

statistic_auto_collect_ratio

FLOAT

0.8

自動収集の統計情報が健全かどうかを判断するためのしきい値です。統計情報の健全性がこのしきい値を下回ると、自動収集がトリガされます。

statistics_max_full_collect_data_size

INT

100

自動収集でデータを収集する最大パーティションサイズです。単位はギガバイトです。パーティションがこの値を超える場合、フル収集は破棄され、サンプル収集が実行されます。

statistic_sample_collect_rows

INT

200000

サンプル収集用の最小行数です。パラメータ値がテーブル内の実際の行数を超える場合、フル収集が行われます。

statistic_exclude_pattern

String

null

ジョブ内で統計情報を収集しないデータベースまたはテーブルの名前を指定します。ジョブ内で統計情報を収集する必要のないデータベースとテーブルを指定できます。正規表現パターンで表します。

例

自動フル収集

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

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

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

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

-- 'db_name'という名前のデータベースを除外して、すべてのデータベースの統計情報を自動的に収集します。
CREATE ANALYZE ALL PROPERTIES (
"statistic_exclude_pattern" = "db_name\\."
);

自動サンプル収集

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

-- 指定したテーブル'db_name.tbl_name'を除外して、データベース内のすべてのテーブルの統計情報を自動的に収集します。
CREATE ANALYZE SAMPLE DATABASE db_name PROPERTIES (
"statistic_exclude_pattern" = "db_name\\.tbl_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

統計情報のタイプ。FULLまたはSAMPLE。

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 SHOW ANALYZE JOBを使用してください。

SHOW ANALYZE STATUS [WHERE predicate];

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 JOBステートメントから取得することができます。

例

KILL ANALYZE 266030;

FE設定項目​

FE設定項目

タイプ

デフォルト値

説明

enable_statistic_collect

BOOLEAN

TRUE

統計情報の収集を有効にするかどうかを示します。この設定のデフォルトはONです。

enable_collect_full_statistic

BOOLEAN

TRUE

自動的なフル統計情報の収集を有効にするかどうかを示します。この設定のデフォルトはONです。

statistic_collect_interval_sec

LONG

300

自動収集中にデータの更新をチェックする間隔です。単位は秒です。

statistic_auto_collect_ratio

FLOAT

0.8

自動収集の統計情報の健全性を判断するしきい値です。統計情報の健全性がこのしきい値を下回ると、自動収集がトリガされます。

statistic_max_full_collect_data_size

LONG

107374182400

自動収集でデータを収集する最大パーティションサイズです。単位はバイトです。パーティションがこの値を超える場合、フル収集は破棄され、サンプル収集が実行されます。

statistic_collect_max_row_count_per_query

INT

5000000000

単一の解析タスクにおいてクエリする最大行数です。この値を超える場合、解析タスクは複数のクエリに分割されます。

statistic_auto_analyze_start_time

STRING

00:00:00

自動収集の開始時刻です。値の範囲は00:00:00 〜 23:59:59です。

statistic_auto_analyze_end_time

STRING

23:59:59

自動収集の終了時刻です。値の範囲は00:00:00 〜 23:59:59です。

statistic_sample_collect_rows

LONG

200000

サンプル収集における最小行数です。このパラメータの値がテーブル内の実際の行数を超える場合、フル収集が実行されます。

statistic_collect_concurrency

INT

3

並行して実行できるマニュアル収集タスクの最大数です。デフォルト値は3です。つまり、最大3つのマニュアル収集タスクを並行して実行できます。この値を超えると、到着するタスクはPENDING状態であり、スケジュール待ちの状態になります。

histogram_buckets_size

LONG

64

ヒストグラムのデフォルトのバケット数です。

histogram_mcv_size

LONG

100

ヒストグラムの最頻値(MCV)の数です。

histogram_sample_ratio

FLOAT

0.1

ヒストグラムのサンプリング比率です。

histogram_max_sample_row_count

LONG

10000000

ヒストグラムの収集に使用する行の最大数です。

statistic_manager_sleep_time_sec

LONG

60

メタデータをスケジュールする間隔です。時間の単位は秒です。この間隔に基づいて、システムは統計情報のデータ保存用テーブルの作成、削除された統計情報の削除、期限切れの統計情報の削除などの操作を実行します。

statistic_analyze_status_keep_second

LONG

259200

収集タスクの履歴を保持する期間です。デフォルトの値は3日です。時間の単位は秒です。

参考文献​