Hologres はバージョン 3.1 以降で論理パーティションテーブルをサポートします。論理パーティションテーブルでは、親テーブルが物理テーブルであり、子テーブルは論理的な概念です。本トピックでは、`CREATE LOGICAL PARTITION TABLE` 文の使用方法について説明します。
制限事項
論理パーティションテーブルをサポートするのは、Hologres バージョン 3.1 以降のインスタンスのみです。
論理パーティションテーブルは `
LIST` パーティショニングのみをサポートし、パーティションキーとして最大 2 列を指定できます。パーティションキーとしてサポートされるデータ型には、`INT`、`TEXT`、`VARCHAR`、`DATE`、`TIMESTAMP`、`TIMESTAMPTZ` があります。
パーティションキーは `NOT NULL` として定義する必要があります。
論理パーティションテーブルのパーティションキーには、生成列 を使用できます。
単一の論理パーティションテーブルは最大 5,200 個のパーティションをサポートします。データベース全体では、最大 200,000 個の論理パーティションをサポートします。
論理パーティションテーブルにデータを書き込む場合、Hologres は必要なパーティションを自動的に作成します。以下の制限および推奨事項が適用されます:
データインジェストジョブおよびデータ品質を最適化してください。ダーティデータ(例:日次パーティションを使用する場合に、深夜 0 時を過ぎないタイムスタンプなど)を回避することで、パーティション数の過剰な増加を防ぎます。
パーティションへの書き込みは順次行うようにしてください。複数のパーティションに同時に書き込まないでください。
単一テーブルに対するバッチインポートジョブには、以下の制限があります:
バッチインポート中、1 ジョブあたり最大 50 個のパーティションへのインポートをサポートします。この上限を超えると、Hologres はエラー `
Bulkload partition count exceed limit, partition count is xxx, limit is xxx` を返します。Fixed Plan を使用してデータをインポートする場合、単一テーブルが同時に 30 個を超えるパーティションに書き込むと、新しいパーティション書き込みリクエストが速度制限されます。Hologres は数秒待機した後、リクエストを自動的に送信します。
Fixed Plan を使用してデータをインポートする場合、単一テーブルが同時に 100 個を超えるパーティションに書き込むと、新しいパーティション書き込みリクエストは `
mem partition count exceed reject limit` エラーで失敗します。
未永続化パーティションが多すぎることによるワーカーノードの過負荷を回避するため、各ワーカーノードは以下の制限を適用します:
未永続化パーティション数が 500 を超えると、新しいパーティション書き込みリクエストが速度制限されます。Hologres は数秒待機した後、リクエストを自動的に送信します。
未永続化パーティション数が 5,000 を超えると、新しいパーティション書き込みリクエストは `
mem partition count exceed reject limit` エラーで失敗します。注:「未永続化パーティション」とは、メモリに書き込まれたがディスクへフラッシュされていないパーティションを指します。カウントには、ユーザーパーティション × シャード数 × 各テーブルのインデックス数が含まれます。シャード数にはレプリカシャードも含まれるため、この制限はシャードの分散状況およびテーブルのインスタンス内ノード間分散状況に依存します。
重要事項
非常に小規模なデータ量(例:1 億行未満)のパーティションを作成しないでください。小規模パーティションはクエリ加速効果を低下させ、多数の小規模ファイルが生成されるリスクを高めます。代わりに、粒度の粗いパーティションをご利用ください。
パーティション内のデータを頻繁に全置き換えする場合(例:`TRUNCATE` や `INSERT OVERWRITE` の使用)には、パーティションテーブルをご利用ください。このシナリオでは、大規模な削除操作を回避できるため、`TRUNCATE` および `INSERT OVERWRITE` のパフォーマンスが優れています。
`TRUNCATE` 文はバイナリログ(Binlog)を生成しません。セッション単位で Binlog の生成を無効にするには、次のコマンドを実行します:
SET hg_experimental_generate_binlog = off。論理パーティションテーブルのパーティションは、手動で作成または削除する必要はありません。パーティションはデータを含む場合にのみ存在します。パーティション内のすべてのデータが削除されると、そのパーティションは自動的に削除されます。
説明Hologres はデータのクリーンアップを非同期で実行するため、パーティションの削除も非同期で行われます。
論理パーティションテーブルのテーブルプロパティを変更するには、REBUILD 構文をご利用ください。バックエンドはタスクを自動的に分割し、パーティション単位で順次実行します。具体的には、論理パーティションテーブルに対してリシャーディング操作(例:テーブルの Table Group の変更)を行う場合、元の `HG_MOVE_TABLE_TO_TABLE_GROUP` ストアドプロシージャは使用しないでください。詳細については、「Table Group および Shard Count 操作ガイド」をご参照ください。
論理パーティションテーブルの作成
構文
論理パーティションテーブルの存在するパーティションは、テーブル内のデータに依存します。パーティションは手動で作成・削除する必要はありません。
-- 論理パーティション親テーブルの作成
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> ([
{
<column_name> <column_type> [ <column_constraints>, [...]]
| <table_constraints>
[, ...]
}
])
LOGICAL PARTITION BY LIST(<partition_column_1> [, <partition_column_2>])
[WITH(
<property_name> = <property_value>
[, ...]
)];パラメーター
パラメーター名 | 説明 |
schema_name | テーブルを含むスキーマの名前です。 親テーブルと子テーブルを同一スキーマに作成する場合は、このパラメーターを省略できます。異なるスキーマに作成する場合は、指定してください。 |
table_name | 作成する親パーティションテーブルの名前です。 |
column_name | 新規テーブルに作成する列の名前です。 |
column_type | 列のデータの型です。 |
column_constraints | 列制約の名前です。 |
table_constraints | テーブル制約の名前です。 |
partition_column | 論理パーティションテーブルのパーティションキーです。1 列または 2 列を指定できます。 |
property_name | 論理パーティションテーブルに設定するテーブルプロパティの名前です。 |
property_value | テーブルプロパティに割り当てる値です。 |
テーブルプロパティ
論理パーティションテーブルの親テーブルは、以下のテーブルプロパティをサポートします。
親テーブルは物理テーブルであり、パーティションは論理的な概念です。そのため、以下のプロパティを個別のパーティションに対して設定することはできません。
プロパティ | 説明 |
partition_expiration_time | パーティションデータの生存時間(TTL)および非同期でのクリーンアップタイミングです。
説明 このプロパティは、単一のパーティションキーを持つテーブル、および時系列に基づくパーティションキーにのみ適用されます。 |
partition_keep_hot_window | パーティションデータがホットストレージに保持される期間です。この期間が経過すると、パーティションデータは非同期でコールドストレージに移動されます。「ホットストレージ/コールドストレージ」の詳細については、「データ階層化ストレージ」をご参照ください。
説明 このプロパティは、単一のパーティションキーを持つテーブル、および時系列に基づくパーティションキーにのみ適用されます。 |
partition_require_filter | 親テーブルに対するクエリでパーティションフィルター条件を必須とするかどうかです。有効な値は以下のとおりです:
|
binlog_level | 親テーブルに対するバイナリログ(Binlog)の有効化設定です。「バイナリログ機能」の詳細については、「Hologres バイナリログの購読」をご参照ください。デフォルト値:`none`。有効な値は以下のとおりです:
|
binlog_ttl | Binlog データの生存時間(TTL)(秒単位)です。デフォルト値は 2592000(30 日)です。 |
partition_generate_binlog_window | データが Binlog を生成するタイムウィンドウです。「現在時刻 − この値」以内に作成されたパーティションのデータのみが Binlog を生成します。
説明 このプロパティは、単一のパーティションキーを持つテーブル、および時系列に基づくパーティションキーにのみ適用されます。 |
その他の重要なプロパティ(例:インデックス) | 論理パーティションテーブルは、`distribution_key` や `clustering_key` などのインデックス、および `orientation` や `time_to_live_in_seconds` などのその他の重要なプロパティをサポートします。 プロパティの詳細については、「CREATE TABLE」をご参照ください。インデックス関連のテーブルプロパティに適切な値を設定するには、「シナリオ別テーブル作成最適化ガイド」をご参照ください。 論理パーティションテーブルは、従来の物理パーティションテーブルの動的パーティション管理プロパティをサポートしません。詳細については、「動的パーティション管理」をご参照ください。 |
パーティションプロパティ
論理パーティションテーブルのパーティションは、以下のプロパティをサポートします。これらのプロパティは、ALTER LOGICAL PARTITION TABLE を使用して変更できます。
パーティションプロパティ | 説明 |
keep_alive | パーティションが自動的にクリーンアップされるかどうかです。有効な値は以下のとおりです:
このプロパティは、親テーブルに `partition_expiration_time` が設定されている場合にのみ有効です。 |
storage_mode | パーティションが特定のストレージクラスを使用するかどうかです。デフォルトでは、このプロパティは設定されていません。未設定の場合、パーティションは親テーブルの `partition_keep_hot_window` 設定に従います。有効な値は以下のとおりです:
|
generate_binlog | パーティションが Binlog を生成するかどうかです。デフォルトでは、このプロパティは設定されていません。未設定の場合、パーティションは親テーブルの `partition_generate_binlog_window` 設定に従います。有効な値は以下のとおりです:
|
例
通常の列 `ds` をパーティションキーとして使用します。
CREATE TABLE public.hologres_logical_parent_1 ( a TEXT, b INT, c TIMESTAMP, ds DATE NOT NULL, PRIMARY KEY (b, ds)) LOGICAL PARTITION BY LIST (ds) WITH ( orientation = 'column', distribution_key = 'b', partition_expiration_time = '30 day', partition_keep_hot_window = '15 day', partition_require_filter = TRUE, binlog_level = 'replica', partition_generate_binlog_window = '3 day' );生成列 `ds` をパーティションキーとして使用します。
CREATE TABLE public.hologres_logical_parent_2 ( a TEXT, b INT, c TIMESTAMP, ds TIMESTAMP GENERATED ALWAYS AS (date_trunc('day', c)) STORED NOT NULL, PRIMARY KEY (b, ds)) LOGICAL PARTITION BY LIST (ds) WITH ( orientation = 'column', distribution_key = 'b', partition_expiration_time = '30 day', partition_keep_hot_window = '15 day', partition_require_filter = TRUE, binlog_level = 'replica', partition_generate_binlog_window = '3 day' );2 列をパーティションキーとして使用します。
CREATE TABLE public.hologres_logical_parent_3 ( a TEXT, b INT, yy TEXT NOT NULL, mm TEXT NOT NULL) LOGICAL PARTITION BY LIST (yy, mm) WITH ( orientation = 'column', distribution_key = 'b', partition_require_filter = TRUE );
論理パーティションテーブルのデータ管理
論理パーティションテーブルにおけるデータ管理では、以下のロックが適用されます:
指定されたパーティションに対するバッチインポートまたは更新、または指定されたパーティションに対する `TRUNCATE`:パーティションロック。他のパーティションには影響しません。
パーティションを指定せずに実行するバッチインポートまたは更新、パーティションを指定せずに実行する `TRUNCATE`、または任意の `DELETE`:テーブルロック。他のデータ管理操作は、ロックが解放されるまで待機します。
Fixed Plan を使用したデータ書き込み、更新、または削除:行ロック。これらの操作は、パーティションまたはテーブルに対するバッチインポート、更新、削除操作と競合しますが、他の Fixed Plan 操作とは競合しません。
親テーブルのデータ管理
親テーブルに対するデータ書き込み、更新、およびクリーンアップ操作は、標準テーブルと同様に動作します。Hologres ストレージエンジンは、データに基づいてパーティションを自動的に作成または削除します。
親テーブルにデータを書き込みます。
INSERT INTO public.hologres_logical_parent_2 VALUES ('a', 1, '2025-03-16 10:00:00'), ('b', 2, '2025-03-17 11:00:00'), ('c', 3, '2025-03-18 12:00:00'), ('d', 4, '2025-03-19 13:00:00'), ('e', 5, '2025-03-20 14:00:00');親テーブルのデータをクリーンアップします。
-- DELETE を使用したクリーンアップ DELETE FROM public.hologres_logical_parent_2 WHERE ds = '2025-03-20'; -- TRUNCATE を使用したクリーンアップ SET hg_experimental_generate_binlog = off; TRUNCATE public.hologres_logical_parent_2;
パーティションのデータ管理
論理パーティションテーブルの特定のパーティションに対するデータ管理も可能です。
論理パーティションへのデータインポート。入力データが指定されたパーティションと一致しない場合、Hologres は該当しない行をエラーなくスキップします。
-- 指定されたパーティションへのインポート INSERT INTO public.hologres_logical_parent_1 PARTITION (ds = '2025-03-16') VALUES ('a', 1, '2025-03-16 10:00:00', '2025-03-16'); -- 不一致行を静かにスキップ INSERT INTO public.hologres_logical_parent_1 PARTITION (ds = '2025-03-16') VALUES ('a', 1, '2025-03-16 10:00:00', '2025-03-16'), ('b', 2, '2025-03-17 11:00:00', '2025-03-17');パーティションデータのクリーンアップ。
計算グループ DML では、指定されたパーティションに対する `TRUNCATE` の自動ルーティングはサポートされていません。`TRUNCATE` はリーダー計算グループで実行してください。
-- DELETE を使用したクリーンアップ DELETE FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16' or ds = '2025-03-17'; -- TRUNCATE を使用したクリーンアップ SET hg_experimental_generate_binlog = off; TRUNCATE public.hologres_logical_parent_1 PARTITION (ds = '2025-03-16') PARTITION (ds = '2025-03-17');`INSERT OVERWRITE` を使用したパーティションの上書き。
Hologres バージョン 3.1 以降では、ネイティブの `INSERT OVERWRITE` 構文がサポートされており、論理パーティションテーブルに対して `INSERT OVERWRITE` 操作を実行できます。「INSERT OVERWRITE」をご参照ください。
重要`INSERT OVERWRITE` は同期処理です。複数の論理パーティションを指定した場合、Hologres はそれらを並列で処理します。これにより、CPU およびメモリ使用量が増加します。複数のパーティションを上書きする場合は、処理を個別のタスクに分割し、順次実行してください。
論理パーティションテーブルのクエリ
物理パーティションテーブルとは異なり、論理パーティションテーブルでは `partition_require_filter` プロパティを設定できます。このプロパティを `TRUE` に設定すると、クエリにはパーティションフィルター条件が必須となります。
パーティションフィルター条件付きで論理パーティションテーブルをクエリします。
SELECT * FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16';パーティションフィルター条件なしで論理パーティションテーブルをクエリします。この場合、親テーブルの `partition_require_filter` プロパティが `
FALSE` に設定されている必要があります。SELECT * FROM public.hologres_logical_parent_1;
その他の操作
Hologres は、論理パーティションテーブルのメタデータをクエリするための以下のシステムテーブルおよび関数を提供しています。
hologres.hg_table_properties:テーブルプロパティを表示します。
hologres.hg_list_logical_partition('<table_name>'):論理パーティションテーブル内のすべてのパーティションを一覧表示します。
hologres.hg_logical_partitioned_table_properties:現在のインスタンス内のすべての論理パーティションおよびそのプロパティを一覧表示します。
hologres.hg_partition_file_status('<table_name>'):論理パーティションテーブル内のすべてのパーティションについて、ホット/コールドストレージのサイズおよびファイル数をクエリします。Hologres バージョン 3.1.4 以降でサポートされます。
例:
テーブルが論理パーティションテーブルであるかどうかを確認します。
SELECT * FROM hologres.hg_table_properties WHERE table_name = '<table_name>' AND property_key = 'is_logical_partitioned_table' AND property_value = 'true';テーブルのすべての論理パーティションを一覧表示します。
SELECT * FROM hologres.hg_list_logical_partition ('<schema_name>.<table_name>');テーブルのすべての論理パーティションプロパティ構成を一覧表示します。
注:このクエリは、子パーティションと親テーブルの間で異なる構成のみを表示します。空の結果は、子パーティションに特別な構成がないことを意味します。
SELECT
*
FROM
hologres.hg_logical_partitioned_table_properties
WHERE
table_namespace = '<schema_name>'
AND table_name = '<table_name>'
ORDER BY partition DESC;テーブル内のすべての論理パーティションの現在のホット/コールドストレージサイズおよびファイル数を表示します。
SELECT * FROM hologres.hg_partition_file_status ('<schema_name>.<table_name>');
前述のシステムテーブルに加えて、論理パーティション(物理テーブルとして実装)は、他の Hologres システムテーブル とも互換性があり、標準テーブルと同様のメタデータクエリ手法をサポートします。例:
論理パーティションテーブルの DDL を表示します。
SELECT hg_dump_script('<schema_name>.<table_name>');親テーブルのプロパティを表示します。
SELECT * FROM hologres.hg_table_properties WHERE table_namespace = '<schema_name>' AND table_name = '<table_name>';論理パーティションテーブルの最大パーティションを表示します。
説明データのクリーンアップおよびパーティションのクリーンアップは非同期で実行されるため、最大パーティションが空になった場合、`max_pt` は誤った結果を返す可能性があります。これを回避するには、他の方法ではなく `INSERT OVERWRITE` を使用してデータを削除してください。
SELECT MAX_PT('<schema_name>.<table_name>');パーティション数が上限を超えているかどうかを確認します。
ストアドプロシージャ `
check_logical_partition_count()` を呼び出して、現在のインスタンス内の論理パーティションテーブルのいずれかがパーティション上限を超えているかどうかを確認できます。CREATE OR REPLACE PROCEDURE check_logical_partition_count() LANGUAGE 'plpgsql' AS $$ DECLARE table_max_partition_count bigint; table_partition_count bigint; exceeded_logical_partition_limit boolean; row_record record; BEGIN SELECT substring(result FROM '^[^:]*: (\d+)')::INTEGER INTO table_max_partition_count FROM hg_admin_command('get_global_flag', 'flag=table_max_partition_count') AS result; RAISE NOTICE 'table_max_partition_count=%', table_max_partition_count; FOR row_record IN SELECT table_namespace, table_name FROM hologres.hg_table_properties WHERE property_key = 'is_logical_partitioned_table' AND (property_value = 'true' OR property_value = 't') LOOP SELECT count(*) INTO table_partition_count FROM hologres.hg_list_logical_partition(quote_ident(row_record.table_namespace) || '.' || quote_ident(row_record.table_name)); IF table_partition_count > table_max_partition_count THEN RAISE NOTICE 'table %.% partition count exceeds limit (% > %)', row_record.table_namespace, row_record.table_name, table_partition_count, table_max_partition_count; END IF; END LOOP; END; $$; CALL check_logical_partition_count();