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

Hologres:テーブルグループとシャードの管理

最終更新日:Jul 23, 2026

Hologres でテーブルグループとシャード数を設定して、ワークロード全体のクエリパフォーマンス、書き込みスループット、ストレージ効率のバランスをとります。

このドキュメントでは、テーブルグループの作成、クエリ、変更、削除の方法、およびワークロードが変化した場合のテーブルのリシャーディング方法について説明します。

テーブルグループとシャードの仕組み

Hologres インスタンスは、データを 2 階層の構造で整理します:

  • テーブルグループ -- 1 つ以上のテーブルを保持する論理的なコンテナです。同じテーブルグループ内のすべてのテーブルは、同じシャード数を共有します。

  • シャード -- データ分散の単位です。シャードは並列処理のためにワーカー (コンピューティングノード) に分散されます。

概念

役割

インスタンス

1 つ以上のデータベースを含み、各データベースには 1 つ以上のテーブルグループがあります。

テーブルグループ

シャード数を共有するテーブルをグループ化します。JOIN されるテーブルは、同じテーブルグループに属している必要があります。

シャード

並列処理のためにワーカー全体にデータを分散します。

ワーカー

1 つ以上のシャードを処理するコンピューティングノードです。

すべてのデータベースには、シャード数がインスタンス仕様と一致するデフォルトのテーブルグループがあります。ほとんどのワークロードでは、このデフォルトで十分です。

設定に関する推奨事項

以下のガイドラインに従ってください:

  • デフォルトのテーブルグループを使用する:ワークロードが異なるシャード数を必要としない限り、デフォルトのテーブルグループを使用してください。インスタンスサイズごとのデフォルトのシャード数は、「インスタンス管理」に記載されています。

  • 大規模インスタンス (> 256 CU):負荷分散のために、複数のテーブルグループを検討してください:

    • 大容量のデータ -- より高いシャード数を持つ別のテーブルグループを作成します。

    • 多数の小さなテーブル -- より低いシャード数を持つ別のテーブルグループを作成して、クエリの起動オーバーヘッドを削減します。

  • JOIN するテーブルは同じテーブルグループを共有する必要があります。

  • テーブルごとにテーブルグループを作成しないでください。これにより、不要なオーバーヘッドと断片化が発生します。

  • シャード数をワーカーに合わせてください。リソースをバランスよく使用し、スケールアウトを容易にするために、シャード数をワーカーの倍数に設定します。

重要

既存のテーブルグループのシャード数は変更できません。シャード数を変更するには、新しいテーブルグループを作成し、テーブルをそこにリシャーディングする必要があります。

シャード数の上限

Hologres V2.0 以降、デフォルトの上限により、過剰なシャードによる割り当ての失敗が防止されます。上限を超えると、too many shards in this instance エラーが返されます。

上限は以下の式に従います:

  • テーブルグループあたりの最大シャード数 = デフォルトのシャード数 x 2

  • インスタンスあたりの最大合計シャード数 = デフォルトのシャード数 x 8

インスタンス仕様

デフォルトのコンピューティングノード

デフォルトのシャード (V0.10.31+)

テーブルグループあたりの最大シャード数 (V2.0+)

インスタンスあたりの最大シャード数 (V2.0+)

32 CU

2

20

40 (20 x 2)

160 (20 x 8)

64 CU

4

40

80 (40 x 2)

320 (40 x 8)

96 CU

6

60

120 (60 x 2)

480 (60 x 8)

128 CU

8

80

160 (80 x 2)

640 (80 x 8)

160 CU

10

80

160 (80 x 2)

640 (80 x 8)

192 CU

12

80

160 (80 x 2)

640 (80 x 8)

256 CU

16

120

240 (120 x 2)

960 (120 x 8)

384 CU

24

160

320 (160 x 2)

1280 (160 x 8)

512 CU

32

160

320 (160 x 2)

1280 (160 x 8)

...

...

M

M x 2

M x 8

これらの上限を無効にするには (非推奨 — リソース割り当ての失敗を引き起こす可能性があります):

SET hg_experimental_enable_shard_count_cap = off;

権限

スーパーユーザーのみが、テーブルグループの作成、変更、削除、またはテーブルの別のテーブルグループへの移動 (リシャーディング) を実行できます。

ユーザーにスーパーユーザー権限を付与するには:

-- <Alibaba Cloud account ID> をユーザーの UID に置き換えます。
-- RAM ユーザーの場合、アカウント ID の前にプレフィックス「p4_」を追加します。
ALTER USER "<Alibaba Cloud account ID>" SUPERUSER;

新しいテーブルをテーブルグループに割り当てるには、テーブル作成権限のみが必要です。

テーブルグループのメタデータのクエリ

デフォルトのテーブルグループの表示

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'
);

出力例:

 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)

出力では、is_default_tg がデフォルトのテーブルグループを示し、shard_count がそのシャード数を示します。

すべてのテーブルグループのリスト表示

SELECT tablegroup_name
FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;

テーブルグループのシャード数の表示

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

テーブルグループ内のテーブルのリスト表示

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

テーブルのテーブルグループの検索

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

テーブルグループの作成

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

パラメーター

型

説明

new_tg_name

Text

テーブルグループ名

shard_count

INT4

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

例:

-- 「tg_8」という名前で 8 つのシャードを持つテーブルグループを作成します。
CALL HG_CREATE_TABLE_GROUP('tg_8', 8);
説明
  • 既存のテーブルは、元のテーブルグループに残ります。

  • 元のテーブルグループは、そのすべてのテーブルとデータが移動または削除された後にのみ無効になります。

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

新しいテーブルが自動的に割り当てられるように、別のデフォルトのテーブルグループを設定します。

説明

Hologres V0.9 以降が必要です。インスタンスがそれより前のバージョンの場合は、まずインスタンスをアップグレードしてください。

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

パラメーター

型

説明

tg_name

TEXT

デフォルトとして設定するテーブルグループの名前。そのシャード数がデータベースの新しいデフォルトになります。

例:

-- 「tg_8」をデフォルトのテーブルグループとして設定します。
CALL HG_UPDATE_DATABASE_PROPERTY('default_table_group', 'tg_8');

新しいテーブルを特定のテーブルグループに割り当てる

CREATE TABLE と SET_TABLE_PROPERTY の呼び出しをトランザクションでラップします:

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

パラメーター

型

説明

table_name

TEXT

新しいテーブルの名前

tg_name

TEXT

対象のテーブルグループ。テーブルはこのテーブルグループのシャード数を継承します。

例:

-- テーブル「tbl1」を作成し、テーブルグループ「tg_8」に割り当てます。
BEGIN;
CREATE TABLE tbl1 (
    col1 text
);
CALL SET_TABLE_PROPERTY('tbl1', 'table_group', 'tg_8');
COMMIT;

テーブルのリシャーディング

インスタンスをスケールアップしても、既存のデータベースのシャード数は調整されません。追加されたキャパシティを使用するには、より高いシャード数を持つ新しいテーブルグループを作成し、テーブルをそこに移動します。スケールアップ後に作成された新しいデータベースは、更新されたデフォルトを使用します。インスタンス仕様の概要。

3 つの方法が利用可能です:

方法

サポートされるテーブルタイプ

最小バージョン

Liquid Table

非パーティション化テーブルと論理パーティションテーブル (動的。読み取り/書き込みを中断せずに即時反映)

Hologres V4.2

REBUILD コマンド

非パーティション化テーブル、物理パーティションテーブル、論理パーティションテーブル (パーティションごとに順次実行)

Hologres V3.1

ストアドプロシージャ

非パーティション化テーブルと物理パーティションテーブル

Hologres V0.10

Liquid Table を使用したリシャーディング

Hologres V4.2 以降、Liquid Table はテーブルグループ間を動的に移動できます。この変更は、読み取りや書き込みを中断することなく即座に有効になります。Liquid Table。

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

Hologres V3.1 以降、REBUILD コマンドは、リアルタイムの進捗監視機能を使用して、テーブルグループ間でテーブルを非同期に移動します。REBUILD (ベータ版)。

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

Hologres V0.10 以降、組み込みのストアドプロシージャを使用して、テーブルを再作成したりデータを再インポートしたりすることなく、新しいテーブルグループに移動できます。

制限事項

  • Hologres V0.10 以降が必要です。バージョンは [Instance Details] ページで確認できます。それより前のバージョンの場合は、インスタンスをアップグレードするか、オンラインサポートをご利用ください。

  • リシャーディング中はすべての書き込みを停止してください。読み取りは影響を受けません。Hologres V1.1 以降では、set table readonly を使用して、リアルタイム書き込みタスクの自動フェイルオーバーが可能です。

  • リシャーディングは CPU を消費し、一時的にストレージを増加させます。オフピーク時に実行してください。

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

  • SERIAL フィールドを持つテーブルはリシャーディングできません。DEFAULT 値を持つテーブルは、リシャーディング後に DEFAULT 属性を失います。

  • テーブルはビューなどの他のオブジェクトに依存していてはなりません。リシャーディングの前に依存関係を削除してください。さもないと、Hologres は "ERROR: resharding table xxx can not executed because other objects depend on it." を返します。ビューの依存関係をバイパスするには、set hg_experimental_hg_insert_overwrite_enable_view=on; を設定します。

  • リシャーディングは Simple Permission Model (SPM) にのみ適用されます。詳細については、「Hologres 権限モデル」をご参照ください。

  • リシャーディングでは、自動パーティション化プロパティは保持されません。

  • Hologres V2.0 以降、リシャーディング中に列コメントが保持されます。それより前のバージョンでは、列コメントを手動でバックアップおよび復元してください。

構文

Hologres V2.0.24 以降の場合:HoloWeb を使用して、グラフィカルインターフェイス経由でリシャーディングを実行します。詳細については、「テーブルのリシャーディング」をご参照ください。

それより前のバージョンの場合:以下の SQL コマンドを実行します。

-- 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

new_table_group_name

対象のテーブルグループ。

new_tg

重要
  • テーブルを移動する前に、新しいテーブルグループを作成します。詳細については、「テーブルグループの作成」をご参照ください。

  • リシャーディング中は、テーブルに対するすべての書き込み操作を停止してください。読み取りは影響を受けません。

  • テーブルグループからすべてのテーブルが移動した後、不要になった場合は HG_DROP_TABLE_GROUP を使用して空のテーブルグループを手動で削除します。

  • パーティションテーブルの場合は、親テーブルのみを操作してください。

  • 仮想ウェアハウスインスタンスでは、移行は対象テーブルグループのリーダー仮想ウェアハウスによって実行される必要があり、その仮想ウェアハウスはフォロワーとしてソーステーブルグループにアクセスする必要もあります。詳細については、「コンピューティンググループにデータアクセスを承認する」をご参照ください。

リシャーディング例外の処理

リシャーディングは、OOM エラーや手動での終了によって中断されることがあります。中断された場合、元のテーブルは読み取り専用になり、<initial_table_name>_xxxxxxxx という名前の一時テーブルが表示されます。

Hologres V2.0.24 以降のインスタンスの場合:

  • HoloWeb: UI からリシャーディングを続行またはキャンセルします。詳細については、「テーブルのリシャーディング」をご参照ください。

  • SQL:以下の手順に従ってください。

以前のバージョンのインスタンスの場合:まず V2.0.24 以降にアップグレードしてください。

リシャーディングを再開するには、根本原因を解決し、HG_MOVE_TABLE_TO_TABLE_GROUP コマンドを再度実行してください。

リシャーディングをキャンセルして元の状態に戻すには、以下のコマンドを順番に実行してください:

-- 1. 元のテーブルから読み取り専用フラグを削除します。
CALL set_table_property('<schema_name>.<table_name>', 'readonly', 'false');

-- 2. 一時テーブルの名前を見つけます。
-- パーティションテーブルの場合:
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;

-- 3. 一時テーブルを削除します。
DROP TABLE IF EXISTS <schema_name>.<target_temp_table_name>;

-- 4. リシャーディングの進捗記録をクリアします。
CALL hologres.hg_internal_clear_resharding_properties('<schema_name>.<table_name>');

テーブルグループの削除

まずテーブルグループからすべてのテーブルを削除し、次に以下を実行してください:

CALL HG_DROP_TABLE_GROUP('<tg_name>');

例:

CALL HG_DROP_TABLE_GROUP('tg_8');

シャードからワーカーへの分散の確認

ワーカー間でのシャードの不均等な分散は、負荷の不均衡と非効率的なリソース使用を引き起こします。

Hologres V1.3 以降、worker_info システムビューを使用して、シャードとワーカーのマッピングを確認できます。「基本概念」ではシャードとノードの関係について説明しており、「ワーカー間のシャード割り当てのクエリ」でクエリ構文を提供しています。

ベストプラクティス

デフォルトのテーブルグループは、ほとんどのワークロードに適しています。カスタム設定については、「テーブルグループ設定のベストプラクティス」をご参照ください。

よくある質問

"internal error: Get rundown is not allowed in recovering state" エラーの意味

このエラーは、テーブルが読み取り専用であり、INSERT、UPDATE、DELETE 操作がブロックされていることを示します。Hologres は、データ不整合を防ぐために、リシャーディングが中断されたときにこの状態を設定します。

解決するには:

  1. すべての読み取り専用テーブルを検索してください:

       SELECT * FROM hologres.hg_table_properties
       WHERE property_key = 'readonly' AND property_value = 'true';
  2. 読み取り専用フラグを削除してください。<table_name> を完全修飾テーブル名 (例:public.my_table) に置き換えてください。

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