このトピックでは、AnalyticDB for MySQLにおける統計の目的と種類について説明します。また、統計が自動的に収集される方法、手動で収集する方法、および統計を表示する方法についても説明します。
機能紹介
クエリ オプテマイザーは、統計を使用して、実行エンジン用の高品質な実行計画を生成します。実行計画の質は、クエリのパフォーマンスに直接影響します。
AnalyticDB for MySQL には、デフォルトで有効になっている統計自動収集機能が含まれています。カーネルバージョン 3.1.9.2 以降のクラスタでは、列グループ統計もサポートされています。この機能はデフォルトでは無効になっており、手動で有効にする必要があります。メンテナンスウィンドウ中に、AnalyticDB for MySQL は、テーブルのデータ量に基づいて、基本統計、ヒストグラム統計、および列グループ統計の完全収集またはサンプリング収集を自動的に実行します。多くの列の統計が必要な場合、完全収集には数日かかる場合があります。メンテナンスウィンドウ外では、AnalyticDB for MySQL は、基本統計の自動増分収集を定期的に実行します。
AnalyticDB for MySQL は、データのインポート方法に応じて、異なる収集ポリシーを使用します。
INSERT OVERWRITEを使用したバッチインポートの場合、AnalyticDB for MySQL は、基本統計を即座に自動的に収集します。INSERT INTOまたはREPLACE INTOを使用したリアルタイムインポートの場合、AnalyticDB for MySQL は、ビルド完了後のメンテナンスウィンドウまたは増分収集期間中に、増分収集タスクをトリガーします。データのインポート後、基本統計を手動で 1 回収集することをお勧めします。
統計の自動収集を無効にし、ANALYZE TABLE 文を実行して、統計を手動で収集することもできます。詳細については、「統計を手動で収集する」をご参照ください。
AnalyticDB for MySQL の統計自動収集は、内部テーブルにのみ適用され、外部テーブルには適用されません。統計の手動収集は、内部テーブルと外部テーブルの両方に適用されます。
使用上の注意
統計機能は、カーネルバージョン 3.1.6.1 以降の Enterprise Edition、Basic Edition、Data Lakehouse Edition、 および Data Warehouse Edition クラスタでサポートされています。
AnalyticDB for MySQL クラスタのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。
統計の分類と選択
AnalyticDB for MySQL は、基本 (BASIC)、ヒストグラム (HISTOGRAM)、および列グループ (GROUP_STATS) の 3 種類の統計を収集します。ヒストグラムと列グループ統計は、完全収集またはサンプリング収集によって収集されます。基本統計は、完全収集、サンプリング収集、または自動増分収集によって収集されます。デフォルトの方法は、自動増分収集です。
カーネルバージョン 3.1.9.2 以降のクラスタのみが、基本統計、ヒストグラム統計、および列グループ統計のサンプリング収集をサポートしています。
基本統計
基本統計には、列の最大値、最小値、バイト単位の平均長、個別値の数、および NULL 値の割合が含まれます。
シナリオ:
フィルタリング操作または結合操作で使用されていない列。
プライマリキー列など、データが均等に分散されている列。
ヒストグラム
ヒストグラムは、テーブルの基本統計に基づいて、範囲内のデータをバケットに分割することによって作成されます。ヒストグラムの各バケットは、特定の範囲のデータ特性を表します。
分類:
ハイブリッド ヒストグラム: ホットスポット値をより適切に記述できる等高ヒストグラムのバリエーション。
頻度ヒストグラム: 個別値の数が少ない列に適しています。各値はバケットに対応します。
AnalyticDB for MySQL は、適切なヒストグラムを自動的に選択します。
シナリオ: フィルタリング操作と結合操作で使用される、データが不均一に分散されている列。データが均等に分散されている場合は、フィルタリングと結合のシナリオで、基本統計をヒストグラムの代わりに使用できます。
基本統計と比較して、ヒストグラムはテーブル統計をより正確に反映しますが、コストが高く、より多くのキャッシュ領域を使用します。テーブルが多いシナリオでは、すべての列のヒストグラムを収集すると、キャッシュヒット率が低下する可能性があります。デフォルトのキャッシュには、約 20,000 列のヒストグラムの統計、または約 200 万列の基本統計を格納できます。
列グループ統計
カーネルバージョン 3.1.9.2 以降のクラスタのみが、列グループ統計機能をサポートしています。
基本統計とヒストグラムは、単一の列に対して収集されます。列グループ統計は、同じテーブル内の複数の列に対して収集され、それらの間の相関関係を表します。
シナリオ: 多列集約に使用します。複数の列の相関が高い場合は、列グループ統計を使用して、出力行数をより正確に推定し、より適切な実行方法を選択します。
統計の自動収集
統計の自動収集を有効または無効にする
AnalyticDB for MySQL は、統計の自動収集をサポートしています。この機能はデフォルトで有効になっています。次のコマンドを実行して、無効にしたり、再度有効にしたりできます。
SET adb_config O_CBO_AUTONOMOUS_STATS_ENABLED = [false|true];列グループ統計の自動収集を有効または無効にする
カーネルバージョン 3.1.9.2 以降のクラスタでは、列グループ統計の自動収集がサポートされています。この機能はデフォルトでは無効になっています。次のコマンドを実行して、有効または無効にすることができます。
SET adb_config O_CBO_MAINTENANCE_WINDOW_COLLECT_GROUP_STATS_ENABLED = [false|true];列グループ統計の自動収集を使用する前に、統計の自動収集が有効になっていることを確認してください。
メンテナンスウィンドウを設定する
統計自動収集のデフォルトのメンテナンスウィンドウは、04:00 から 05:00 です。次のコマンドを実行して、メンテナンスウィンドウを変更できます。ウィンドウはオフピーク時に設定することをお勧めします。開始時刻と終了時刻の間隔は、1 分以上 3 時間以下である必要があります。開始時刻は終了時刻よりも前である必要があります。無効な時間を入力すると、デフォルトの時間が使用されます。
メンテナンスウィンドウでは、クラスタと同じタイムゾーンが使用されます。
SET adb_config O_CBO_MAINTENANCE_WINDOW_DURATION = [04:00-05:00];統計収集のデータ量しきい値を設定する
次のコマンドを使用して、統計収集のデータ量しきい値を設定できます。デフォルト値は 5,000,000,000 (50 億) 行です。
SET adb_config O_CBO_MAINTENANCE_WINDOW_COLLECTOR_ROW_LIMIT = 10000;テーブルの行数がデータ量しきい値を超える場合:
カーネルバージョンが 3.1.9.2 より前のクラスタの場合、統計収集はテーブルをスキップします。
カーネルバージョンが 3.1.9.2 以降のクラスタの場合、テーブルの統計はサンプリングによって収集されます。
統計収集の負荷制限を有効または無効にする
メンテナンスウィンドウ中に、AnalyticDB for MySQL は、統計自動収集中の負荷を制限して、テーブルのスキャン時の I/O リソース使用量を削減します。この機能はデフォルトで有効になっています。メンテナンスウィンドウ中にリソースがアイドル状態の場合は、負荷制限を無効にして統計の更新を高速化できます。
SET adb_config O_CBO_AUTONOMOUS_STATS_SCAN_RATE_LIMIT_ENABLED = [false|true];指定されたリソースグループで統計を収集する
デフォルトでは、統計自動収集はシステムアカウントを使用してコマンドを実行します。特定のリソースグループで統計自動収集コマンドを実行するには、次のコマンドを実行してデータベースアカウントを指定します。データベースアカウントを指定した後、AnalyticDB for MySQL は、そのアカウントに関連付けられているリソースグループでコマンドを実行します。データベースアカウントは、すべてのテーブルのすべての列に対するクエリ権限を持っている必要があり、リソースグループに関連付けられている必要があります。リソースグループを関連付ける方法の詳細については、「リソースグループを作成および管理する」をご参照ください。
SET adb_config O_CBO_AUTONOMOUS_STATS_ACCOUNT = [user_name];列の有効期限比率を設定する
列のデフォルトの有効期限比率は 0.1 (10%) です。`UPDATE`、`DELETE`、`INSERT`、または `REPLACE` 操作の影響を受ける行の比率が、テーブルの合計行数に対する有効期限比率を超えると、テーブルの統計は期限切れと見なされます。AnalyticDB for MySQL は、メンテナンスウィンドウ中に、期限切れのテーブルのすべての列の統計を再収集します。有効期限比率を超えない場合、統計はメンテナンスウィンドウ中に自動的に収集されません。
SET adb_config O_CBO_STATS_EXPIRED_RATIO = 0.1;統計を手動で収集する
テーブル全体の統計を収集する
ANALYZE TABLE コマンドは、テーブル全体をスキャンして統計を収集します。大きなテーブルの場合、テーブル全体の統計を収集するには時間がかかる場合があります。このコマンドはオフピーク時に実行するか、サンプリングによって統計を収集することをお勧めします。
構文
ANALYZE TABLE [schema_name.]table_name [UPDATE [BASIC|HISTOGRAM|GROUP_STATS]] [ON column_name[,...]] [WITH ENABLE SAMPLING]パラメータ
パラメータ | 必須 | 説明 |
| いいえ | データベース名。 |
| はい | テーブル名。AnalyticDB for MySQL は、このテーブルの統計を収集します。各 |
| いいえ | 統計の種類。有効な値:
重要 カーネルバージョン 3.1.9.2 以降のクラスタのみが、列グループ統計機能をサポートしています。 |
| いいえ | 統計を収集する列。列を指定しない場合、テーブルのすべての列の統計が収集されます。 |
| いいえ | サンプリングによって統計を収集します。 重要 カーネルバージョン 3.1.9.2 以降のクラスタのみが、基本統計、ヒストグラム統計、および列グループ統計のサンプリング収集をサポートしています。 |
例
adb_demo.customerテーブルのすべての列の基本統計を収集します。次のいずれかの文を使用できます。ANALYZE TABLE adb_demo.customer;ANALYZE TABLE adb_demo.customer UPDATE BASIC;
adb_demo.customerテーブルのcustomer_id列の基本統計を収集します。ANALYZE TABLE adb_demo.customer UPDATE BASIC ON customer_id;adb_demo.customerテーブルのcustomer_id列とlogin_time列のヒストグラム情報を収集します。ANALYZE TABLE adb_demo.customer UPDATE HISTOGRAM ON customer_id,login_time;adb_demo.customerテーブルのcustomer_id列とlogin_time列の列グループ統計をサンプリングによって収集します。ANALYZE TABLE adb_demo.customer UPDATE GROUP_STATS ON customer_id,login_time with enable sampling;
パーティションの統計を収集する
バージョンの制限
Enterprise Edition、Basic Edition、および Data Lakehouse Edition のカーネルバージョン 3.1.9.1 以降のクラスタのみが、ANALYZE TABLE コマンドを使用して OSS 外部テーブルのパーティションの基本統計の完全収集を実行することをサポートしています。
AnalyticDB for MySQL クラスタのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。
構文
ANALYZE TABLE table_name WITH PARTITIONS = ARRAY[ARRAY[PARTITION_KEYS] [, PARTITION_KEYS, ....]]パラメータの説明
パラメータ | 必須 | 説明 |
| はい | テーブル名。AnalyticDB for MySQL は、このテーブルの統計を収集します。各 |
| はい | 統計を収集するパーティション。 |
例
test1パーティションテーブルの 2023-01 パーティションと 2023-02 パーティションの統計を収集します。ANALYZE TABLE test1 WITH PARTITIONS = ARRAY[ARRAY['2023-01'], ARRAY['2023-02']];test2パーティションテーブルの (1,1) パーティションと (1,0) パーティションの統計を収集します。ANALYZE TABLE test2 WITH PARTITIONS = ARRAY[ARRAY[1, 1], ARRAY[1, 0]];
統計情報の表示
統計情報は、AnalyticDB for MySQL にバイナリ形式で保存されます。INFORMATION_SCHEMA システムテーブルで統計情報を表示できます。
テーブルレベルの統計情報を表示するには、次のコマンドを実行します。
SELECT * FROM INFORMATION_SCHEMA.TABLE_STATISTICS;基本統計、ヒストグラム、列グループ統計など、列レベルの統計情報を表示するには、次のコマンドを実行します。
SELECT * FROM INFORMATION_SCHEMA.COLUMN_STATISTICS;
よくある質問
ANALYZE コマンドがスロークエリと診断されるのはなぜですか?
ANALYZE 文は、メンテナンスウィンドウ中に自動的に開始され、I/O 速度制限と低い CPU 優先度で実行されます。実行時間が長いため、スロークエリと診断される場合があります。ただし、これはサービスには影響しません。 CPU 負荷が高くない場合、または CPU の過負荷がメンテナンスウィンドウと密接に関連していない場合は、この問題を無視できます。 CPU が継続的に過負荷になっている場合は、このトピックの「統計収集によって発生した CPU の過負荷によってクエリの応答時間が影響を受ける場合の対処方法」セクションを参照して、この問題を解決してください。
統計機能を使用すると、CPU 負荷が高くなる原因は何ですか?
CPU が過負荷になる原因は次のとおりです。
デフォルトのメンテナンスウィンドウである 04:00 から 05:00 の間、システムは各テーブルのフルスキャンを実行して列統計を収集します。この期間中、CPU は過負荷になります。
ほとんどの場合、統計は増分的に収集されるため、大量のリソースは消費されません。デフォルトでは、統計機能は、V3.1.6 以降を実行する AnalyticDB for MySQL Data Warehouse Edition クラスタで有効になっています。クラスタが以前のマイナーバージョンから V3.1.6 以降に更新されると、完全な統計が収集されます。これにより、マイナーバージョンの更新後の最初の数日間、CPU が過負荷になる可能性があります。完全データスキャンが完了すると、CPU 負荷は減少します。
CPU が過負荷になっている場合は、クエリの応答時間が影響を受けているかどうかを確認してください。クエリの平均応答時間が大幅に変化しない場合は、クエリの応答時間は影響を受けません。統計収集中は CPU 使用率メトリックの値が高くなる場合がありますが、クエリが実行されると、リソースは実行に優先的に割り当てられます。これは、ANALYZE 文が I/O 速度制限と低い CPU 優先度で実行されるためです。
CPU 負荷が高いとクエリの応答時間に影響を与える場合はどうすればよいですか?
次の解決策を使用して、この問題を解決できます。
メンテナンスウィンドウをオフピーク時に変更します。
set adb_config O_CBO_MAINTENANCE_WINDOW_DURATION = [04:00-05:00];適切なオフピーク時間を判断できない場合は、システムクエリの I/O 制限を 16 MB 以上の値に変更することをお勧めします。デフォルト値は 50 MB です。
set adb_config CSTORE_IO_LIMIT_SYSTEM_QUERY_BPS = 52428800;負荷を分離するために、統計収集を低優先度のリソースグループに割り当てます。詳細については、「統計」トピックの「自動統計収集」セクションをご参照ください。
set adb_config O_CBO_AUTONOMOUS_STATS_ACCOUNT = [user_name];収集するデータを減らすために、列の有効期限比率を増やします。デフォルト値は 0.1 です。値の範囲は 0 から 1 です。有効期限比率を 0.5 より大きい値に設定しないことをお勧めします。
set adb_config O_CBO_STATS_EXPIRED_RATIO = 0.1;
上記の解決策のいずれでもこの問題が解決しない場合は、set adb_config O_CBO_AUTONOMOUS_STATS_ENABLED=false; 文を実行して、自動統計収集を無効にします。ただし、パフォーマンスが低下する可能性があります。今後統計を収集する場合は、手動で統計を収集する必要があります。詳細については、「統計」トピックの「統計を手動で収集する」セクションをご参照ください。
統計が数日間更新されないのはなぜですか?
この問題は、次の原因で発生します。
統計の有効期限が切れていません。
更新、挿入、または置換されたデータ量が有効期限比率に達すると、統計の有効期限が切れます。デフォルトの有効期限比率は 0.1 (10%) です。変更されたデータ量が少量の場合は、引き続きクラスタを想定どおりに使用し、この問題をさらに 1 週間観察できます。
多くの列とテーブルに大量のデータが含まれています。
デフォルトでは、増分更新に含まれていない統計を収集するには、1 日あたり 1 時間しか必要ありません。 1,000 列を超えるなど、多数の列とテーブルが関係している場合、システムは 1 日以内に更新を完了できない可能性があります。更新が完了するまでに 1 週間かかる場合があります。この場合、数日以内に統計が更新されないのは正常です。引き続きクラスタを想定どおりに使用し、この問題を観察できます。
新しいテーブルにデータをインポートすると、統計は自動的に更新されますか?
INSERT OVERWRITE 文を使用してデータをバッチインポートする場合、データのインポートが完了すると、基本的な統計が自動的に収集されます。 INSERT INTO 文または REPLACE INTO 文を使用してデータをリアルタイムでインポートする場合、統計は次のメンテナンスウィンドウ中に収集されるか、各 BUILD タスクの完了後に増分収集期間中に増分収集タスクがトリガーされます。データのインポート後に、基本的な統計を手動で収集することをお勧めします。詳細については、「統計」トピックの「統計を手動で収集する」セクションをご参照ください。