すべてのプロダクト
Search
ドキュメントセンター

Hologres:ANALYZE文と自動分析

最終更新日:Jun 18, 2025

このトピックでは、ANALYZE文と自動分析機能の使用方法について説明します。

ANALYZE文

統計情報は、適切な実行プランを生成できるかどうかを判断します。Hologresは、データ分布と特性、テーブル統計、列統計、行数、列数、フィールド幅、カーディナリティ、頻度、最大値、最小値、高頻度値、バケット分布特性に関するサンプル統計を収集します。これらの統計情報は、オプティマイザーが演算子の実行推定コストを更新し、クエリ範囲を絞り込み、最適な結合順序、メモリオーバーヘッド、並列度 (DOP) を推定するのに役立ちます。このようにして、オプティマイザーは最適な実行プランを生成できます。

ANALYZE文を使用すると、データベース内のテーブルデータに関する統計情報を収集できます。その後、Hologresのオプティマイザーは、統計情報に基づいて最適なクエリプランを生成し、クエリの効率を向上させます。

  • 構文

    -- 次の構文は、テーブルに関する統計情報を更新するために使用されます。テーブル内のすべての列に関する統計情報は、デフォルトで収集されます。
    analyze <tablename>;
    
    -- 次の構文は、特定の列に関する統計情報を更新するために使用されます。この構文は、前の構文よりも多くのデータをサンプリングします。この構文を使用して収集された統計情報は、より正確です。この構文を使用して、条件を格納する列に関する統計情報を更新できます。
    analyze <tablename>(<colname>, <colname>);
  • パラメーター

    tablename パラメーターは、統計情報を更新するテーブルの名前を指定し、colname パラメーターは、統計情報を更新する列の名前を指定します。

  • 構文の説明

    2つのANALYZE文には、次の類似点と相違点があります。

    • 類似点

      • 2つのANALYZE文は、1つ以上の列に関する統計情報を収集するために使用できます。収集される情報には、行数、列幅、列内の最も一般的な値、列のヒストグラム、列内の個別値の数 (NDV) が含まれます。

      • 2 つの文で指定された列の場合、列に関する統計情報は上書きされます。他の列に関する統計情報は変更されません。たとえば、analyze <tablename>(<colname1>); 文を実行した後、colname1 列に関する統計情報は、この文によって返された統計情報によって上書きされます。colname2 列に関する統計情報は変更されません。

    • 相違点

      • analyze <tablename>;: この文によって返される統計情報は、サンプリングされたデータに基づいて収集されます。

      • analyze <tablename>(<colname>, <colname>);: この文を実行すると、Hologres は APPROX_COUNT_DISTINCT 関数を実行して列の NDV を計算します。ほとんどの場合、この文を使用して計算された NDV は、サンプリングされたデータに基づく NDV よりも正確ですが、より多くのオーバーヘッドが発生します。したがって、特定の列に関する詳細な統計情報を収集する場合にのみ、この文を使用することをお勧めします。列幅や列のヒストグラムなど、NDV 以外の統計情報は、サンプリングされたデータに基づいて収集されます。

      colname1 と colname2 という名前の 2 つの列を持つテーブルの場合、analyze table; 文は analyze table(colname1, colname2); 文と同等ではありません。

      JOIN 列または GROUP BY 列に対して analyze <tablename>(<colname>, <colname>); 文を使用して、これらの列に関する詳細な統計情報を取得することをお勧めします。

  • シナリオ

    次のシナリオでは、テーブルに対して analyze <tablename>; 文を実行することをお勧めします。

    • テーブルに対して多数のINSERT、UPDATE、DELETE、またはデータインポート操作が実行される場合。

    • テーブルJOIN操作のパフォーマンスが低下している場合。この場合、テーブルJOIN操作を実行する前に、JOIN列とGROUP BY列に対してANALYZE文を実行できます。

    • CREATE FOREIGN TABLE 文を実行した後、現在の外部テーブルに関する統計情報を収集する場合。

    • IMPORT FOREIGN SCHEMA 文を実行した後、クエリを実行するテーブルに関する統計情報を収集する場合。

    • CREATE EXTERNAL DATABASE 文を実行した後、現在の外部テーブルに関する統計情報を収集する場合。

  • 使用上の注意

    • Hologres V0.10およびV1.1では、親テーブルをクエリする場合は、親テーブルに対してANALYZE文を実行します。子テーブルをクエリする場合は、子テーブルに対してANALYZE文を実行します。親テーブルと子テーブルの両方をクエリする場合は、両方のテーブルに対してANALYZE文を実行して、一部の統計情報が省略されないようにします。

    • 次のいずれかの問題が発生した場合は、インポートタスクを実行する前にANALYZE文を実行する必要があります。これにより、効率が向上します。

      • 複数のテーブルが結合されると、メモリ不足 (OOM) 例外が発生します。次のエラーメッセージが報告されます: Query executor exceeded total memory limitation xxxxx: yyyy bytes used

      • インポート効率が低い。Hologresでデータをクエリまたはインポートすると、タスクの完了に時間がかかります。これにより、効率が低下します。

    • クエリ対象のテーブルに、BYTEA 型のビットマップインデックスを持つ列や、サイズが 1 KB を超える TEXT 型の列など、非常に幅の広い列が含まれている場合、これらの列に関する統計情報は役に立たず、データサンプリングでメモリを消費します。このようなテーブルの場合、analyze <tablename>; 文を実行しないことをお勧めします。代わりに、analyze <tablename>(<colname>, <colname>); 文を実行して、JOIN 列、GROUP BY 列、FILTER 列など、必要な列のみを分析できます。

      説明

      ビジネス要件に基づいて、非常に幅の広い列のベンチマークを設定できます。通常、データサイズが 1 KBを超える列は、非常に幅の広い列と見なされます。

自動分析機能

Hologres V0.10以降では、自動分析機能がサポートされています。この機能を有効にすると、ANALYZE文を繰り返し手動で実行する必要はありません。Hologresは、作成されたテーブルの数、書き込まれたデータ量、変更されたデータ量に基づいて、関連するテーブルに対してANALYZE操作を自動的に実行するかどうかを判断します。これにより、操作の複雑さが軽減され、ANALYZE文の省略による統計収集の漏れを防ぎます。

  • 構文

    • 次の文は、自動分析機能が有効になっているかどうかを確認するために使用されます。

      SHOW hg_enable_start_auto_analyze_worker;  -- Hologres V1.1 以降の構文
      
      SHOW hg_experimental_enable_start_auto_analyze_worker; -- Hologres V0.10 の構文
    • データベースの自動分析機能を有効または無効にするには、次の文を使用します。スーパーユーザーのみが文を実行できます。

      -- Hologres V1.1 以降の構文
      ALTER DATABASE dbname SET hg_enable_start_auto_analyze_worker = ON; -- 指定されたデータベースの自動分析機能を有効にします。 hg_enable_start_auto_analyze_worker パラメーターのデフォルト値は ON です。
      ALTER DATABASE dbname SET hg_enable_start_auto_analyze_worker = OFF; -- 指定されたデータベースの自動分析機能を無効にします。
      
      -- Hologres V0.10 の構文
      ALTER DATABASE dbname SET hg_experimental_enable_start_auto_analyze_worker = ON; -- 指定されたデータベースの自動分析機能を有効にします。 hg_experimental_enable_start_auto_analyze_worker パラメーターのデフォルト値は ON です。
      ALTER DATABASE dbname SET hg_experimental_enable_start_auto_analyze_worker = OFF; -- 指定されたデータベースの自動分析機能を無効にします。
      
      -- 外部データベースの自動分析機能を有効にする構文
      ALTER EXTERNAL DATABASE dbname WITH enable_auto_analyze 'true';
  • 制限事項

    Hologresの自動分析機能を使用する場合は、次の制限事項に注意してください。

    • 自動分析機能は、Hologres V0.10 以降でのみサポートされています。 Hologres インスタンスのバージョンは、Hologres コンソールのインスタンス詳細ページで確認できます。インスタンスのバージョンが V0.10 より前の場合は、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、Hologres DingTalk グループに参加してインスタンスのアップグレードを申請してください。 Hologres インスタンスを手動でアップグレードする方法の詳細については、「インスタンスのアップグレード」をご参照ください。 Hologres DingTalk グループへの参加方法の詳細については、「Hologres のオンラインサポートを受ける」をご参照ください。

    • スーパーユーザーのみが自動分析機能を有効または無効にできます。

    • 自動分析機能には、パーティションテーブルに対して次の制限があります。

      • 変更された子テーブルに自動分析機能が実装される前に、関連する親テーブルに対してANALYZE操作が実行されます。

      • デフォルトでは、データサンプリング中に、システムは一度に最大 224 (16,777,216) 個のデータエントリをスキャンできます。子テーブルのデータエントリの合計数が 16,777,216 を超える場合、データエントリは異なるパーティションに分散され、特定のパーティションのデータエントリのみがサンプリングされます。特定のパーティションのデータエントリの合計数は、16,777,216 を超えることはできません。

        説明

        パーティション分割は、パーティションキー列の統計収集には影響しませんが、パーティションキー列と同じデータを持つ列など、パーティションキー列と同じ方法でデータが分散されている列の統計収集には影響します。このような列が存在する場合、これらの列の一部のデータがサンプリングされない可能性があり、データエントリの数が不正確になる可能性があります。ご質問がある場合は、DingTalkグループ (ID 32314975) のテクニカルサポートにお問い合わせください。テクニカルサポートチームは、ビジネス要件に基づいて、一度にスキャンできるデータエントリの最大数を調整するのに役立ちます。

    • デフォルトでは、自動分析機能を使用して、一度に最大 256 列の統計を収集できます。テーブルに 256 を超える列がある場合、最初の 256 列の統計が収集されます。 hg_experimental_auto_analyze_max_columns_count パラメーターの値を変更して、上限を調整できます。

    • デフォルトでは、自動分析機能で使用される各ワーカーには最大 4 GB のメモリを割り当てることができます。テーブルに超ワイド列がある場合、データサンプリング用のメモリリソースが不足しているため、ANALYZE 操作が失敗する可能性があります。 auto_analyze_work_memory_mb パラメーターの値を変更して、上限を調整できます。ただし、Hologres インスタンスで使用可能な残りのメモリサイズに注意する必要があります。 Hologres インスタンスにより高度なインスタンスタイプを選択すると、より多くのワーカーを使用できるようになり、自動分析機能でより多くのメモリリソースを使用できるようになります。

    • Hologres V3.1.0 以降でのみ、ANALYZE および自動分析を使用して、外部データベースの外部テーブルに関する統計を収集できます。

    • ANALYZE および自動分析を使用して、HMS 外部テーブルに関する統計を収集することはできません。

  • 自動分析機能の仕組み

    自動分析機能を有効にすると、システムはANALYZE操作が必要なテーブルを定期的に検索します。

    • 非パーティションテーブルやパーティションテーブルなどの内部テーブルを含む通常のテーブル

      • システムは、1分間隔でテーブルに対するDML操作をチェックします。このようなDML操作には、INSERT、UPDATE、DELETE操作が含まれ、データの変更が発生する可能性があります。次のいずれかの条件が満たされると、システムはANALYZE操作を実行してテーブルに関する統計情報を収集します。

        • 非パーティションテーブルの場合、DML操作が実行され、データエントリの 10% 以上が変更されます。パーティションテーブルの場合、DML操作が実行され、現在のパーティションのデータエントリの 10% 以上が変更されます。

        • TRUNCATE TABLE操作が実行されて、テーブルデータがクリアされます。

        • テーブルに対してDDL操作が実行されます。たとえば、CREATE TABLE操作を実行してテーブルを作成するか、ALTER TABLE操作を実行してテーブルスキーマを変更します。テーブル属性を変更するために使用されるCALL SET_TABLE_PROPERTY操作は、ANALYZE操作をトリガーしません。

      • システムは、10分間隔で内部テーブルのデータ変更をチェックします。前回のチェック結果と比較してデータエントリの 10% 以上が変更された場合、バックエンドでこのテーブルに対してANALYZE操作が実行されます。

        説明

        これにより、Realtime Compute for Apache Flink、Data Integration、Holo Clientなどを使用してリアルタイムでデータ書き込みを行うことによって発生する暗黙的なDML操作によるデータ変更が省略されるのを防ぎます。

    • 外部テーブル

      システムは、4 時間間隔で外部テーブルのデータ変更とメタデータ変更をチェックします。次の条件が満たされると、システムは ANALYZE 操作を実行してテーブルに関する統計を収集します。

      マッピングされた外部テーブル(MaxCompute テーブルや DLF テーブルなど)のデータは、前回のチェックが完了してから 4 時間以内に変更されます。 last_modify_time パラメーターで指定された時刻が前回のチェックが完了した時刻よりも後の場合、この条件が満たされます。

    説明

    チェックとその対応するANALYZE操作は、同じスケジューリングタスクにあります。チェックは、前のANALYZE操作が完了し、スケジューリングタスクで指定された2つの連続するチェックの間隔が経過した場合にのみ開始できます。

  • 自動分析機能のパラメーターを設定する

    自動分析機能を有効にすると、Hologresはテーブルを定期的にチェックして、テーブルに対してANALYZE操作を実行するかどうかを判断します。ANALYZE操作が実行されると、データがサンプリングされ、統計情報が収集されます。これにより、Hologresインスタンスのリソースが消費されます。

    デフォルト設定は、特定のビジネスシナリオには適用されない場合があります。たとえば、Hologresインスタンスにデータが頻繁に書き込まれない場合は、自動分析機能のデフォルト設定を変更することで、自動ANALYZE操作の頻度を減らすことができます。ビジネス要件に基づいて、自動分析機能のデフォルト設定を変更できます。これにより、機能のパフォーマンスをきめ細かく最適化できます。

    説明

    スーパーユーザーとしてデフォルト設定を変更できます。この機能を有効にする場合は、データベースレベルで必要なパラメーターを設定する必要があります。設定は 1 分後に有効になります。

    • 構文

      -- スーパーユーザーとして自動分析機能のデフォルト設定を変更します。
      ALTER DATABASE <dbname> SET <GUC>=<values>;

      dbname パラメーターはデータベースの名前を指定し、GUC パラメーターはパラメーターの名前を指定し、values パラメーターは GUC パラメーターの値を指定します。

    • パラメーター

      パラメーター

      説明

      サポートされているバージョン

      デフォルト値

      autovacuum_naptime

      テーブルに対する操作の2つの連続するチェックの間隔。単位: 秒。

      Hologres V1.1.0以降

      説明

      設定を変更するには、Hologres DingTalk グループ(ID 32314975)のテクニカルサポートにお問い合わせください。

      60秒

      • ALTER DATABASE <dbname> SET autovacuum_naptime = 60;

      • ALTER DATABASE <dbname> SET autovacuum_naptime = '60s';

      • ALTER DATABASE <dbname> SET autovacuum_naptime = '10min';

      hg_auto_check_table_changes_interval

      内部テーブルのデータ変更の2つの連続するチェックの間隔。単位: 秒。

      Hologres V1.1.0以降

      600 秒(10 分)

      -- Hologres V1.1 以降の構文
      ALTER DATABASE <dbname> SET hg_auto_check_table_changes_interval = '600s';
      -- Hologres V0.10 の構文
      ALTER DATABASE <dbname> SET hg_experimental_auto_check_table_changes_interval = '600s';

      hg_auto_check_foreign_table_changes_interval

      外部テーブルのデータ変更の2つの連続するチェックの間隔。単位: 秒。

      Hologres V1.1.0以降

      14400 秒(4 時間)

      -- Hologres V1.1 以降の構文
      ALTER DATABASE <dbname> SET hg_auto_check_foreign_table_changes_interval = '14400s';
      -- Hologres V0.10 の構文
      ALTER DATABASE <dbname> SET hg_experimental_auto_check_foreign_table_changes_interval = '14400s';

      hg_experimental_auto_analyze_max_columns_count

      一度に統計情報が自動的に収集される列の最大数。

      Hologres V1.1.0以降

      256

      ALTER DATABASE <dbname> SET hg_experimental_auto_analyze_max_columns_count =300;

      auto_analyze_work_memory_mb

      単一テーブルの自動分析機能で占有できるメモリの最大サイズ。単位: MB。

      Hologres V1.1.54以降

      デフォルトでは、各ワーカーに 4,096 MB(4 GB)のメモリが割り当てられます。 Hologres インスタンスにより高度なインスタンスタイプを選択すると、より多くのワーカーを使用できるようになり、自動分析機能でより多くのメモリリソースを消費できます。

      テーブルの自動分析機能で占有できるメモリサイズの上限を 9 GB に変更します。

      ALTER DATABASE <dbname> SET auto_analyze_work_memory_mb =9216;

      hg_experimental_auto_analyze_start_time

      毎日 ANALYZE 操作が開始される時刻。

      説明

      このパラメーターで指定された時刻は、end_time パラメーターで指定された時刻と同じタイムゾーンである必要があります。 開始時刻は、終了時刻以前である必要があります。

      Hologres V1.1.54以降

      00:00 +0800

      ANALYZE 操作が 00:00 から 06:00 の間に実行されるように指定します。日中は、内部テーブルと外部テーブルのデータは変更されず、ANALYZE 操作は必要ありません。

      • ALTER DATABASE <dbname> SET hg_experimental_auto_analyze_start_time = '00:00 +0800';
      • ALTER DATABASE <dbname> SET hg_experimental_auto_analyze_end_time = '06:00 +0800';

      hg_experimental_auto_analyze_end_time

      毎日 ANALYZE 操作が終了する時刻。

      Hologres V1.1.54以降

      23:59 +0800

      autovacuum_enabled

      自動分析機能を有効にするかどうかを指定します。

      Hologres V1.1.54以降

      true。これは、データベース内のすべてのテーブルに対してこの機能を有効にすることを意味します。

      テーブルの自動分析機能を無効にします。 ANALYZE 操作はこのテーブルでは実行されません。

      説明

      次の文のみを使用して、Hologres 内部テーブルの自動分析機能を無効にできます。

      ALTER TABLE <tablename> SET (autovacuum_enabled = false);

テーブル統計情報のクエリ

hologres_statistic.hg_table_statistic という名前のテーブルにテーブル統計が記録されます。テーブルに対する ANALYZE 操作の実行ステータスを確認するには、次の文を実行します。

説明

最後の ANALYZE 操作に関する情報をクエリする場合は、analyze_timestamp パラメーターに基づいて情報をソートします。

SELECT schema_name,                -- テーブルのスキーマ。
       table_name,                 -- テーブルの名前。
       schema_version,             -- テーブルのバージョン。
       statistic_version,          -- 最後の ANALYZE 操作で使用された統計のバージョン。
       total_rows,                 -- 最後の ANALYZE 操作に含まれる行数。
       analyze_timestamp           -- 最後の ANALYZE 操作が終了した時刻。
FROM   hologres_statistic.hg_table_statistic
WHERE  table_name = '<tablename>'
ORDER BY analyze_timestamp DESC;
  • hologres_statistic.hg_table_statistic テーブルには、各テーブルにつき 0 から n 個の統計レコードが格納されます。 hologres_statistic.hg_table_statistic テーブルにテーブルの統計レコードが 0 件格納されている場合、このテーブルでは ANALYZE 操作は実行されていません。 hologres_statistic.hg_table_statistic テーブルにテーブルの統計レコードが 1 つ以上格納されている場合、このテーブルでは少なくとも 1 つの ANALYZE 操作が実行されています。

  • schema_version パラメーターの値が統計レコードで異なる場合は、hologres_statistic.hg_table_statistic テーブルにテーブルの統計レコードが 2 つ以上格納されています。これは、テーブルのスキーマが変更されたためです。たとえば、ADD COLUMN 文を実行すると、システムはこの操作の統計レコードを生成し、既存の統計レコードを破棄します。

  • 次のサンプルコードは、hologres_statistic.hg_table_statisticテーブルに 2 つの統計レコードが格納されているテーブルのクエリ結果の例を示しています。この例では、最初の統計レコードのschema_version パラメーターの値は、2番目の統計レコードの値よりも大きくなっています。したがって、2番目の統計レコードは破棄されます。

     schema_name |    table_name    | schema_version | statistic_version | total_rows |  analyze_timestamp
    -------------+------------------+----------------+-------------------+------------+---------------------
     public      | tbl_name_example |             13 |              8580 |      10002 | 2022-04-29 16:03:18
     public      | tbl_name_example |             10 |              8576 |      10002 | 2022-04-29 15:41:20
    (2 rows)
  • Hologres V0.10 および V1.1 では、履歴統計レコードは hologres_statistic.hg_table_statistic テーブルから削除されません。履歴レコードに注意を払う必要はありません。

統計情報が収集されていないテーブルを表示する

HG_STATS_MISSING ビューから、データベース内の統計情報が収集されていないテーブルを表示できます。詳細については、「HG_STATS_MISSING ビュー」をご参照ください。

FAQ

次のシナリオでは、自動分析機能が正しく動作しません。このセクションで提供されている解決策に従うことで、問題を解決できます。

  • hologres_statistic.hg_table_statisticテーブルに統計レコードがないのはなぜですか?

    • 問題の説明: hologres_statistic.hg_table_statistic テーブルでテーブルに関する統計情報をクエリしようとすると、統計情報が返されません。

    • 原因:

      • 自動分析機能が有効になっていないか、クエリするテーブルがANALYZE操作をトリガーする条件を満たしていません。

      • 自動分析機能でエラーが発生しました。チケットを送信してトラブルシューティングを行ってください。

    • 解決策: ANALYZE文を実行します。

  • analyze_timestamp パラメーターの値が非常に小さいのはなぜですか?

    • 問題の説明: クエリ結果で、analyze_timestamp パラメーターの値が現在のタイムスタンプよりもはるかに小さくなっています。これは、ANALYZE 操作が長期間実行されていないことを意味します。

    • 原因:

      • 自動分析機能が正しく動作していません。

      • 自動分析機能が一度手動で無効にされました。

    • 解決策: ANALYZE操作を手動でトリガーします。次に、チケットを送信してトラブルシューティングを行ってください。