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

Hologres:テーブルグループと Shard Count のユーザーガイド

最終更新日:Dec 27, 2025

リアルタイム分析やログ収集など、リアルタイムのデータ処理や大規模なデータ収集を必要とするシナリオでは、大量の同時読み取り/書き込みリクエストが発生することがあります。適切なテーブルグループと Shard Count を指定することで、データ分布と負荷分散を実現できます。この実践により、クエリパフォーマンスが最適化され、データストレージと計算効率が向上します。

テーブルグループと Shard Count の設定に関する推奨事項

Hologres では、Shard とテーブルグループを柔軟に指定できます。類似製品と比較して、Hologres は特定のシナリオに合わせてスキーマをカスタマイズするための、より柔軟で使いやすいメソッドを提供します。この機能は、ビジネス要件を満たすのに役立ちます。ビジネスを十分に理解することで、Hologres が提供する高性能を最大限に活用できます。テーブルグループを設定する際は、以下の基本ルールに従ってください:

  • 必要な場合を除き、新しいテーブルグループを作成しないでください。代わりにデフォルトのテーブルグループを使用してください。インスタンス仕様の詳細については、「インスタンス管理」をご参照ください。

  • 256 コアを超える大規模なインスタンスでは、必要に応じて複数のテーブルグループを作成してワークロードのバランスを取ることができます。

    • データ量が大きい場合は、Shard Count が大きい別のテーブルグループを作成します。

    • データ量が少ないテーブルが多数ある場合は、Shard Count が小さい別のテーブルグループを作成します。これにより、クエリ起動のオーバーヘッドが削減されます。

  • 結合 (Local Join) が必要なテーブルは、同じテーブルグループに属している必要があります。

  • テーブルごとに個別のテーブルグループを設定しないでください。

  • Shard Count を設定する際は、ワーカーの数と将来のスケールアウトを考慮してください。リソース割り当てのバランスを取るために、Shard Count をワーカー数の倍数に設定します。

  • 既存のテーブルグループの Shard Count は変更できません。Shard Count を変更するには、新しいテーブルグループを作成する必要があります。

  • Shard Count を高く設定しすぎないでください。そうしないと、計算リソースの割り当てに失敗し、余分なオーバーヘッドが発生する可能性があります。Hologres V2.0 以降では、Shard Count が過剰になることによるリソース割り当ての失敗を防ぐため、単一テーブルグループの Shard Count とインスタンスの合計 Shard Count にデフォルトで上限が設定されています。合計 Shard Count が上限を超えると、too many shards in this instance というエラーが報告されます。上限は以下のルールによって決定されます:

    • 単一テーブルグループの最大 Shard Count = 単一テーブルグループのデフォルト Shard Count × 2

    • インスタンスの最大合計 Shard Count = 単一テーブルグループのデフォルト Shard Count × 8

    • 上限を調整するには、以下の GUC パラメーターを使用してそれらを削除できます。ただし、これは推奨されません。Shard Count を高く設定しすぎると、計算リソースの割り当てに失敗する可能性があります。

      set hg_experimental_enable_shard_count_cap =off;
    • 以下の表に、Shard Count の上限をリストします。

      インスタンスタイプ

      デフォルトの計算ノード数

      デフォルトの Shard Count (V0.10.31 以降)

      単一テーブルグループの最大 Shard Count (V2.0 以降)

      インスタンスの合計最大 Shard Count (V2.0 以降)

      32 コア

      2

      20

      40 (20 × 2)

      160 (20 × 8)

      64 コア

      4

      40

      80 (40 × 2)

      320 (40 × 8)

      96 コア

      6

      60

      120 (60 × 2)

      480 (60 × 8)

      128 コア

      8

      80

      160 (80 × 2)

      640 (80 × 8)

      160 コア

      10

      80

      160 (80 × 2)

      640 (80 × 8)

      192 コア

      12

      80

      160 (80 × 2)

      640 (80 × 8)

      256 コア

      16

      120

      240 (120 × 2)

      960 (120 × 8)

      384 コア

      24

      160

      320 (160 × 2)

      1280 (160 × 8)

      512 コア

      32

      160

      320 (160 × 2)

      1280 (160 × 8)

      ......

      ......

      M

      M × 2

      M × 8

権限

  • テーブルグループの作成、デフォルトテーブルグループの変更、テーブルグループの削除、またはテーブルの別のテーブルグループへの移行 (リシャーディング) を行うには、インスタンスのスーパーユーザー権限が必要です。スーパーユーザーは、以下の文を実行して一般ユーザーにスーパーユーザー権限を付与できます。

    -- "Alibaba Cloud アカウント ID" を実際のユーザー名に置き換えます。RAM ユーザーを使用する場合は、アカウント ID の前にプレフィックス "p4_" を追加します。
    ALTER USER "Alibaba Cloud account ID" SUPERUSER; 
  • 新しいテーブルを指定されたテーブルグループに配置するには、ユーザーアカウントにテーブル作成権限が必要です。

テーブルグループのメタデータの取得

  1. デフォルトのテーブルグループを表示します。

    SELECT * FROM hologres.hg_table_group_properties
    WHERE tablegroup_name IN (
      SELECT tablegroup_name FROM hologres.hg_table_group_properties
      WHERE property_key = 'is_default_tg' AND property_value = '1'
    );

    結果:

    説明

    結果では、is_default_tg はテーブルグループがデフォルトであるかどうかを示し、shard_count はテーブルグループの Shard Count を示します。

    tablegroup_name |   property_key   | property_value
    -----------------+------------------+----------------
     test_tg_default | tg_version       | 1
     test_tg_default | table_num        | 1               
     test_tg_default | is_default_tg    | 1               
     test_tg_default | shard_count      | 3
     test_tg_default | replica_count    | 1
     test_tg_default | created_manually | 0
    (6 rows)
  2. 現在のデータベース内のテーブルグループを表示します。

    SELECT tablegroup_name
    FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;

    結果:

    tablegroup_name
    -----------------
     test_tg_default
    (1 row)
  3. テーブルグループの Shard Count を表示します。

    SELECT property_value AS shard_count
    FROM hologres.hg_table_group_properties
    WHERE property_key = 'shard_count' AND tablegroup_name ='<tg_name>';

    結果:

    shard_count
    -------------
     3
    (1 row)
  4. テーブルグループ内のテーブルを表示します。

    SELECT table_namespace AS schema_name, table_name
    FROM hologres.hg_table_properties
    WHERE property_key = 'table_group' AND property_value = '<tg_name>';

    結果:

    schema_name | table_name
    -------------+------------
     public      | a
    (1 row)
  5. テーブルが属するテーブルグループを表示します。

    SELECT property_value AS table_group_name
    FROM hologres.hg_table_properties
    WHERE property_key = 'table_group' AND table_name = '<table_name>';

    結果:

    table_group_name
    ------------------
     test_tg_default
    (1 row)

テーブルグループを作成する

新しいサービスがある場合や、新しい Shard Count でテーブルグループを作成する必要がある場合は、以下の文を使用できます。

説明
  • 新しいテーブルグループを作成した後、元のテーブルとデータは元のテーブルグループに残ります。それらは自動的に新しいテーブルグループに移行されません。

  • 元のテーブルグループは、そのすべてのテーブルとデータを移行または削除した後にのみ削除されます。

CALL HG_CREATE_TABLE_GROUP ('<new_tg_name>', <shard_count>);

パラメーター:

パラメータ

説明

new_tg_name

Text

新しいテーブルグループの名前。

shard_count

INT4

テーブルグループのシャード数。

例:

-- Shard Count が 8 の tg_8 という名前の新しいテーブルグループを作成します。
CALL HG_CREATE_TABLE_GROUP ('tg_8', 8);

デフォルトテーブルグループの変更

データベースを作成すると、インスタンス内にデフォルトの Shard Count を持つデフォルトのテーブルグループが作成されます。詳細については、「インスタンス管理」をご参照ください。データベースに複数のテーブルグループがあり、デフォルトのものを変更したい場合は、以下の文を使用できます。変更後、新しいテーブルは新しいデフォルトのテーブルグループに保存されます。

説明

Hologres V0.9 以降では、以下の文を実行してデフォルトのテーブルグループを変更できます。ご利用のインスタンスがそれより前のバージョンの場合は、まずアップグレードする必要があります。

CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', '<tg_name>');

説明:

パラメータ

説明

tg_name

TEXT

デフォルトのテーブルグループの名前。このパラメーターを設定すると、このテーブルグループの Shard Count が使用されます。

例:

-- 新しいテーブルグループをデフォルトとして設定します。新しいテーブルはデフォルトでこのテーブルグループを使用します (V0.9 以降)。
CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', 'tg_8');

新しいテーブルの指定テーブルグループへの配置

以下の文を使用して、新しいテーブルを明示的に指定されたテーブルグループに配置できます。

BEGIN;
CREATE TABLE table_name (
    col type,
  ....
);
CALL SET_TABLE_PROPERTY('table_name', 'table_group', '<tg_name>');
COMMIT;

パラメーター:

パラメータ

説明

table_name

TEXT

新しいテーブルの名前。

tg_name

TEXT

指定されたテーブルグループの名前。このパラメーターを設定すると、このテーブルグループの Shard Count が使用されます。

例:

-- tbl1 という名前のテーブルを作成し、tg_8 という名前のテーブルグループに関連付けます。
BEGIN;
CREATE TABLE tbl1 (
    col1 text
);
CALL SET_TABLE_PROPERTY('tbl1', 'table_group', 'tg_8');
COMMIT;

テーブルの新しいテーブルグループへの移行 (リシャーディング)

Hologres では、Shard がデータ処理の同時実行性を向上させます。適切な Shard Count は、クエリと書き込みのパフォーマンスを向上させるのに役立ちます。ほとんどの場合、Hologres インスタンスのデフォルトの Shard Count で十分であり、手動で変更する必要はありません。

インスタンスがスケールアウトされた後、たとえば 32 コアから 128 コアにスケールアウトされた場合、既存のデータベースの Shard Count はデフォルトでは変更されません。パフォーマンスを向上させるために、データベースの Shard Count を増やすことを推奨します。インスタンスに新しいデータベースを作成すると、現在のインスタンスタイプのデフォルトの Shard Count が使用されます。インスタンスタイプと Shard の詳細については、「インスタンス管理」をご参照ください。

インスタンスがスケールアウトまたはスケールインされた後、既存のデータベースの Shard Count は自動的に増減しません。文を使用して Shard Count を設定し、その後データを再インポートする必要があります。

  • 標準テーブルと物理パーティションテーブルの場合、`REBUILD` 構文または組み込みストアドプロシージャのいずれかを使用できます。

  • 論理パーティションテーブルの場合、`REBUILD` 構文の使用を推奨します。この構文は、パーティションごとに自動的に順次実行できます。

REBUILD 構文を使用したリシャーディング

Hologres V3.1 以降では、テーブルを別のテーブルグループに移行するなど、テーブルプロパティを変更するための `REBUILD` コマンドがサポートされています。`REBUILD` 構文は移行タスクを非同期で実行でき、タスクの進行状況のリアルタイムモニタリングをサポートします。詳細については、「REBUILD (ベータ)」をご参照ください。

組み込みストアドプロシージャを使用したリシャーディング

Hologres V0.10 以降では、リシャーディングコマンドが提供されています。Shard Count を変更した後、このコマンドは自動的にデータを再分散します。テーブルを再作成したり、データを再インポートしたりすることなく、元のテーブルとデータをリシャーディングできます。これにより、操作が簡素化され、最適なパフォーマンスを実現できます。

  • 制限事項

    • リシャーディング機能は、Hologres V0.10 以降でのみサポートされています。ご利用の Hologres インスタンスのバージョンは、Hologres コンソールのインスタンス詳細ページで確認できます。ご利用のインスタンスのバージョンが V0.10 より前の場合は、一般的なアップグレード準備エラー」をご参照いただくか、Hologres DingTalk グループに参加してフィードバックを提供してください。詳細については、「Hologres のオンラインサポートの取得」をご参照ください。

    • 現在、リシャーディングはテーブルレベルで実行されます。テーブルをリシャーディングする際は、Flink や Data Integration などのソースからのデータ書き込みを停止する必要があります。テーブルへのクエリは影響を受けません。Hologres V1.1 以降では、set table readonly を実行して、リアルタイム書き込みタスクの自動フェイルオーバーを有効にできます。

    • リシャーディングは、プロセス中に CPU リソースを消費し、ストレージ使用量を増加させます。オフピーク時にリシャーディングを実行することを推奨します。

    • テーブルでバイナリログが有効になっている場合は、リシャーディングの前に無効にしてください。リシャーディングが完了したら、再度バイナリログを有効にしてください。詳細については、「Hologres バイナリログのサブスクライブ」をご参照ください。

    • リシャーディングは、`SERIAL` 自動インクリメントシーケンスまたは `DEFAULT` 値を持つ列を含むテーブルではサポートされていません。`SERIAL` 列を持つテーブルをリシャーディングするとエラーが報告されます。`DEFAULT` 列を持つテーブルをリシャーディングすると、`DEFAULT` プロパティは失われます。

    • リシャーディング中、テーブルはビューなどの他の依存関係を持つことはできません。依存関係が存在する場合は、リシャーディングの前にそれらを削除する必要があります。そうしないと、"ERROR: resharding table xxx can not executed because other objects depend on it." というエラーが報告されます。

    • Hologres V2.2.29 以降および V3.0.36 以降では、ビューの依存関係を持つテーブルをリシャーディングできます。これを行うには、set hg_experimental_hg_insert_overwrite_enable_view=on; コマンドを実行して GUC パラメーターを有効にします。

    • リシャーディングは、簡易権限モデルにのみ適用され、エキスパート権限モデルには適用されません。Hologres の権限モデルの詳細については、「Hologres 権限モデル」をご参照ください。

    • リシャーディングは、テーブルの動的パーティショニングプロパティを保持しません。

    • Hologres V2.0 以降のリシャーディング操作のみが列の `COMMENTS` を保持します。ご利用のインスタンスのバージョンが V2.0 より前の場合は、事前に列の `COMMENTS` をバックアップし、リシャーディング完了後に手動で設定する必要があります。

  • 構文例

    • ご利用のインスタンスが V2.0.24 以降の場合は、HoloWeb を使用してリシャーディングを実行することを推奨します。詳細については、「テーブルのリシャーディング」をご参照ください。

    • ご利用のインスタンスのバージョンが V2.0.24 より前の場合は、以下のコマンドを使用してビジネステーブルを新しいテーブルグループに移行できます。インスタンスのバージョンが V0.10 より前の場合は、まずアップグレードする必要があります。

    説明
    • 移行の前に、新しいテーブルグループが必要です。ない場合は、まず作成してください。詳細については、「テーブルグループの作成」をご参照ください。

    • テーブルを移行する際は、データ書き込みを停止する必要があります。クエリは影響を受けません。

    • 元のテーブルグループ内のすべてのテーブルが移行されると、元のテーブルグループは自動的に削除されます。ビジネスで複数のテーブルグループが必要な場合は、それぞれに適切な Shard Count を設定してください。

    • パーティションテーブルを移行する際は、親テーブルに対してのみ操作を実行する必要があります。

    • ご利用のインスタンスが計算グループタイプで、テーブルをテーブルグループ A からターゲットのテーブルグループ B に移行する必要がある場合は、テーブルグループ B のプライマリ計算グループ W を使用して移行を実行する必要があります。さらに、計算グループ W はテーブルグループ A へのアクセス権限を持っている必要があります。つまり、計算グループ W はテーブルグループ A のフォロワー計算グループとしてロードされている必要があります。計算グループにテーブルグループの権限を付与する方法の詳細については、「計算グループへのデータアクセス権限の付与」をご参照ください。

    -- V1.1 以降のコマンド構文
    CALL HG_MOVE_TABLE_TO_TABLE_GROUP('<table_name>','<new_table_group_name>');
    
    -- V0.10 のコマンド構文
    CALL HG_UPDATE_TABLE_SHARD_COUNT('<table_name>','<new_table_group_name>');
  • パラメータ

    パラメータ

    説明

    table_name

    移行するテーブルの名前。一度に移行できるテーブルは 1 つだけです。複数のテーブルを移行するには、コマンドを複数回実行します。パーティションテーブルの場合、親テーブルに対してのみ操作を実行する必要があります。

    new_table

    table_group_name

    新しいテーブルグループの名前。

    new_tg

  • 例外処理

    テーブルのリシャーディング中、テーブルはまず読み取り専用に設定され、その後一時テーブルを使用して新しいテーブルグループに移行されます。リシャーディングタスクにはデータインポートが含まれ、時間がかかる可能性があるため、Out-of-Memory (OOM) エラーや手動でのタスク終了など、さまざまな例外が発生する可能性があります。このような場合、元のテーブルは読み取り専用状態のままで、データベースに <initial_table_name>_xxxxxxxx という名前の一時テーブルが表示されます。このような場合は、次のように対処してください:

    • Hologres インスタンスのバージョンが V2.0.24 より前の場合、インスタンスをスペックアップするか、チケットを送信してください。インスタンスをスペックアップする方法の詳細については、「インスタンスのスペックアップ」をご参照ください。

    • ご利用の Hologres インスタンスのバージョンが V2.0.24 以降の場合:

      • HoloWeb でリシャーディングを実行している場合は、[続行] または [キャンセル] をクリックします。詳細については、「テーブルのリシャーディング」をご参照ください。

      • 前述のコマンドを実行してリシャーディングしている場合は、次の手順に従ってください:

        1. テーブルのリシャーディングを続行するには、中断の原因となった問題を解決し、テーブルに対して再度 `HG_MOVE_TABLE_TO_TABLE_GROUP` コマンドを実行します。

        2. リシャーディングをキャンセルして初期状態に戻すには、以下のコマンドを順番に実行します:

          -- 元のテーブルの readonly プロパティをキャンセルします。
          CALL set_table_property('<schema_name>.<table_name>','readonly','false');
          
          -- 一時テーブルをクリアします。
            -- 一時テーブルの名前を取得します (パーティションテーブル)。
          SELECT schema_name,target_temp_table_name FROM hologres.hg_resharding_properties WHERE reshard_table_name = <schema_name>.<table_name> AND is_parent_table IS TRUE;
            -- 一時テーブルの名前を取得します (非パーティションテーブル)。
          SELECT schema_name,target_temp_table_name FROM hologres.hg_resharding_properties WHERE reshard_table_name = <schema_name>.<table_name> AND is_parent_table IS FALSE AND is_sub_table IS FALSE;
            -- 一時テーブルをクリアします。
          DROP TABLE IF EXISTS <schema_name>.<target_temp_table_name>;
          
          -- システムテーブルをクリアします。システムテーブルは現在のテーブルのリシャーディングの進行状況を記録します。タスクをキャンセルしたい場合は、システムテーブルから対応するデータをクリアする必要があります。
          CALL hologres.hg_internal_clear_resharding_properties('<schema_name>.<table_name>'); 

テーブルグループの削除

以下の文を使用して、空のテーブルグループを削除できます。テーブルが含まれているテーブルグループは削除できません。

CALL HG_DROP_TABLE_GROUP('<tg_name>');

例:

-- tg_8 という名前のテーブルグループを削除します。
CALL HG_DROP_TABLE_GROUP('tg_8');

Shard とワーカー間のスキュー関係の表示

Shard Count とワーカー数との間には割り当て関係が存在します。詳細については、「Shard とワーカー計算ノードの関係」をご参照ください。Shard がワーカーに均等に割り当てられていない場合、ワーカーリソースのスキューが発生し、負荷が不均一になり、リソース使用が非効率になる可能性があります。そのため、Hologres V1.3 では、現在のデータベース内のワーカー、テーブルグループ、および Shard 間の関係をクエリするための worker_info システムビューが提供されています。このビューは、スキュー問題のトラブルシューティングに役立ちます。ワーカーリソースのスキューを確認する方法の詳細については、「ワーカースキュー関係の表示」をご参照ください。

ベスト プラクティス

テーブルグループは高度な機能です。ほとんどの場合、ビジネスのために新しいテーブルグループを作成したり、Shard Count を変更したりすることは推奨されません。異なるビジネス要件がある場合は、当社のベストプラクティスに基づいて計画することができます。詳細については、「テーブルグループ設定のベストプラクティス」をご参照ください。

よくある質問

リシャーディングは、一時テーブルの作成、元のテーブルの読み取り専用状態への変更、ターゲットテーブルへの書き込み、テーブル名の変更、同期ステータスの記録など、複数のステップを含む複雑なプロセスです。いずれかのステップで例外が発生した場合、システムの状態が不確定になる可能性があります。以下の方法で問題をトラブルシューティングできます。

internal error: Get rundown is not allowed in recovering state. エラーは、更新中のテーブルが読み取り専用状態であることを示します。テーブルに対して `INSERT`、`UPDATE`、または `DELETE` 操作を実行することはできません。読み取り専用状態を終了する必要があります。

  1. 以下のコマンドを実行して、現在読み取り専用状態にあるテーブルを取得します。

    select * from hologres.hg_table_properties where property_key ='readonly' and property_value='true';
  2. 以下のコマンドを実行して、読み取り専用状態を終了します。

    call set_table_property('<table_name>','readonly','false');

    table_name は、読み取り専用状態を終了したいテーブルの名前を指定します。