Hologres V3.1 以降では、論理パーティションテーブルがサポートされています。論理パーティションテーブルでは、親テーブルは物理テーブルであり、その子テーブルは論理的な概念です。このトピックでは、CREATE LOGICAL PARTITION TABLE 文の使用方法について説明します。
制限事項
Hologres V3.1 以降でのみ、論理パーティションテーブルがサポートされています。
論理パーティションテーブルは、
LISTパーティショニングのみをサポートします。最大 2 つのパーティションキー列を指定できます。論理パーティションテーブルのパーティションキーは、INT、TEXT、VARCHAR、DATE、TIMESTAMP、および TIMESTAMPTZ のデータ型をサポートします。
論理パーティションテーブルのパーティションキーには、NOT NULL プロパティが必要です。
論理パーティションテーブルのパーティションキーは、生成列にすることができます。
単一の論理パーティションテーブルは、最大 5,200 個のパーティションをサポートします。データベースは、合計で最大 200,000 個の論理パーティションをサポートします。
論理パーティションテーブルはデータ書き込み時に自動的にパーティションを作成するため、次の制限と推奨事項が適用されます:
データ書き込みジョブを最適化し、Data Quality を使用してダーティデータを回避します。たとえば、データを日単位でパーティション分割する場合、タイムスタンプが 00:00:00 以外のデータを避けてください。この方法により、パーティションの過剰な拡大を防ぎます。
同時に多くのパーティションに書き込むことを避けるため、パーティションにデータを順次書き込みます。
単一テーブルのインポートジョブには、次の制限が適用されます:
バッチインポート中、単一のインポートジョブは最大 50 個のパーティションにデータをインポートできます。この制限を超えると、エラーメッセージ
Bulkload partition count exceed limit, partition count is xxx, limit is xxxが返されます。Fixed Plan を使用してデータをインポートする場合、単一テーブルで同時に書き込まれるパーティションの数が 30 を超えると、新しい書き込みリクエストはスロットルされます。リクエストは数秒後に自動的にコミットされます。
Fixed Plan を使用してデータをインポートする場合、単一テーブルで同時に書き込まれるパーティションの数が 100 を超えると、新しい書き込みリクエストはエラーメッセージ
mem partition count exceed reject limitで失敗します。
インスタンスまたは計算グループレベルで、次のスロットリングメカニズムが適用されます:
1 分あたりに 50 を超える新しいパーティションが作成されると、新しいパーティション作成リクエストはスロットルされます。リクエストは数秒後に自動的にコミットされます。
1 分あたりに 100 を超える新しいパーティションが作成されると、新しいパーティション作成リクエストはエラーメッセージ
mem partition count exceed reject limitで失敗します。インメモリテーブルの場合、Fixed Plan を使用するときに、同時に書き込まれるパーティションの総数が 500 に達すると、新しい書き込みリクエストはスロットルされます。リクエストは数秒後に自動的にコミットされます。総数は次の数式を使用して計算されます: (単一テーブルに書き込まれたパーティションの数 × シャードの数 / ワーカーの数)。行ストレージと列ストレージの両方を使用するテーブルの場合、結果に 2 を掛けます。次に、すべてのテーブルの結果を合計します。
インメモリテーブルの場合、Fixed Plan を使用するときに、同時に書き込まれるパーティションの総数が 5,000 に達すると、新しい書き込みリクエストはエラーメッセージ
mem partition count exceed reject limitで失敗します。総数は次の数式を使用して計算されます: (単一テーブルに書き込まれたパーティションの数 × シャードの数 / ワーカーの数)。行ストレージと列ストレージの両方を使用するテーブルの場合、結果に 2 を掛けます。次に、すべてのテーブルの結果を合計します。
注意
1 億行未満など、データ量が非常に少ないパーティションの使用は避けてください。この方法は、クエリの高速化パフォーマンスを低下させ、多数の小さなファイルを作成する可能性があります。代わりに、より大きなパーティション粒度を使用してください。
`TRUNCATE` や `INSERT OVERWRITE` などの操作を使用してパーティション内のすべてのデータを頻繁に置き換える必要がある場合は、パーティションテーブルを使用してください。これらはパフォーマンスを向上させ、大規模な削除操作を回避するのに役立ちます。
`TRUNCATE` 操作はバイナリログをサポートしていません。セッションレベルで
SET hg_experimental_generate_binlog = offコマンドを実行する必要があります。論理パーティションテーブルのパーティションを手動で作成する必要はありません。パーティションは、データが含まれている場合にのみ存在します。パーティション内のすべてのデータが削除されると、パーティションも自動的に削除されます。
説明Hologres は非同期操作としてデータクリーンアップを実行します。したがって、パーティションも非同期で削除されます。
論理パーティションテーブルのプロパティを変更するには、REBUILD 構文を使用します。システムはタスクを自動的に分割し、パーティションごとに順次実行します。テーブルのテーブルグループを変更するリシャーディング操作を実行するには、`HG_MOVE_TABLE_TO_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 | パーティションの有効期限。パーティションの有効期限が切れると、そのデータは非同期でクリアされます。
説明 このプロパティは、時間ベースのデータ型の単一のパーティションキーにのみ適用されます。 |
partition_keep_hot_window | パーティションデータがホットストレージに残る期間。この期間が過ぎると、データは非同期でコールドストレージに移動されます。ホットストレージとコールドストレージの詳細については、「データ階層化」をご参照ください。
説明 このプロパティは、時間ベースのデータ型の単一のパーティションキーにのみ適用されます。 |
partition_require_filter | 親テーブルをクエリするときにパーティションキーのフィルター条件が必要かどうかを指定します。有効な値:
|
binlog_level | 親テーブルのバイナリログを有効にするかどうかを指定します。バイナリログ機能の詳細については、「Hologres バイナリログのサブスクライブ」をご参照ください。有効な値:
|
binlog_ttl | バイナリログデータの存続時間 (TTL) (秒単位)。デフォルト値は 2592000 で、これは 30 日です。 |
partition_generate_binlog_window | 親テーブルデータのバイナリログを生成するためのタイムウィンドウ。バイナリログは、`現在の時間 - パラメーター値` の範囲内にあるパーティションのデータに対してのみ生成されます。
説明 このプロパティは、時間ベースのデータ型の単一のパーティションキーにのみ適用されます。 |
インデックスなどのその他の重要なプロパティ | 論理パーティションテーブルは、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 | パーティションのバイナリログを生成するかどうかを指定します。デフォルトでは、このプロパティは設定されておらず、パーティションは親テーブルの 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;
パーティションのデータ管理
論理パーティションテーブルは、指定されたパーティションでのデータ管理操作もサポートします。
論理パーティションにデータをインポートします。インポートするデータが指定されたパーティションと一致しない場合、一致しないデータは無視されます。
-- パーティションを指定してデータをインポートする 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', 3, '2025-03-16 10:00:00', '2025-03-16'), ('b', 2, '2025-03-17 11:00:00', '2025-03-17');パーティションからデータをクリアします。
計算グループの自動 DML ルーティング機能は、指定されたパーティションに対する `TRUNCATE` 操作のルーティングをサポートしていません。これらの操作は、プライマリ (Leader) 計算グループで実行する必要があります。
-- 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 V3.1 以降では、ネイティブの `INSERT OVERWRITE` 構文がサポートされています。論理パーティションテーブルに対して `INSERT OVERWRITE` 操作を実行できます。詳細については、「INSERT OVERWRITE」をご参照ください。
重要`INSERT OVERWRITE` ジョブは同期タスクです。同時に複数の論理パーティションを指定すると、これらのパーティションの `INSERT OVERWRITE` ジョブは並行して処理されます。これにより、CPU とメモリの負荷が高くなる可能性があります。複数の論理パーティションに対して `INSERT OVERWRITE` 操作を実行するには、操作をパーティションごとに複数のジョブに分割し、順次処理することをお勧めします。
論理パーティションテーブルのクエリ
物理パーティションテーブルとは異なり、論理パーティションテーブルは `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_list_logical_partition('<table_name>'): 論理パーティションテーブルのすべてのパーティションをリストします。
hologres.hg_logical_partitioned_table_properties: 現在のインスタンス内のすべての論理パーティションとそのプロパティ構成をリストします。
hologres.hg_partition_file_status('<table_name>'): Hologres V3.1.4 以降、この関数を使用して、論理パーティションテーブル内のすべてのパーティションのホットストレージとコールドストレージに保存されているデータ量をクエリできます。
例:
テーブルのすべての論理パーティションを表示します。
SELECT * FROM hologres.hg_list_logical_partition ('<スキーマ名>.<テーブル名>');テーブルのすべての論理パーティションのプロパティ構成を表示します。
注: このクエリは、親テーブルと異なるサブパーティションの構成のみを表示します。結果が空の場合、サブパーティションには特別な構成はありません。
SELECT
*
FROM
hologres.hg_logical_partitioned_table_properties
WHERE
table_namespace = '<スキーマ名>'
AND table_name = '<テーブル名>'
ORDER BY partition DESC;テーブル内のすべての論理パーティションのホットストレージとコールドストレージの現在のデータ量を表示します。
SELECT * FROM hologres.hg_partition_file_status ('<スキーマ名>.<テーブル名>');
前述のシステムテーブルに加えて、論理パーティションテーブルは物理テーブルです。他の Hologres システムテーブルと互換性があり、標準テーブルと同じメタデータクエリメソッドをサポートします。次の例は、メタデータをクエリする方法を示しています:
論理パーティションテーブルの DDL 文を表示します。
SELECT hg_dump_script('<スキーマ名>.<テーブル名>');論理パーティションテーブルの親テーブルのプロパティを表示します。
SELECT * FROM hologres.hg_table_properties WHERE table_namespace = '<スキーマ名>' AND table_name = '<テーブル名>';論理パーティションテーブルの最大のパーティションを表示します。
説明論理パーティションテーブルのデータクリーンアップとパーティションクリーンアップは非同期操作です。最大のパーティションからデータをクリアするには、`INSERT OVERWRITE` 操作を使用してデータを削除します。そうしないと、`MAX_PT` 関数が正しくない結果を返す可能性があります。
SELECT MAX_PT('<スキーマ名>.<テーブル名>');