論理パーティションテーブルを使用すると、パーティションライフサイクル管理を自動化できます: Hologres はデータの到着時にパーティションを作成し、パーティションが空になると削除します。親テーブルは物理テーブルであり、各パーティションは論理的な概念で、個別の物理オブジェクトではありません。
次の場合に論理パーティションテーブルを使用します:
-
データセットが大規模で、時系列またはカテゴリベースである場合 (日次ログ、イベントストリーム、テナントデータ)。
-
DDL のオーバーヘッドなしで、Hologres にパーティションの作成とクリーンアップを自動的に管理させたい場合。
-
パーティション単位の有効期限、ホット/コールド階層化、または選択的なバイナリログ生成を行いたい場合。
TRUNCATE または INSERT OVERWRITE でパーティション全体を頻繁に置き換える場合は、物理パーティションテーブルを推奨します。これらの操作は大規模な削除を回避できるため、物理パーティションの方が高速です。
論理パーティションテーブルには Hologres 3.1 以降が必要です。
制限事項
-
LISTパーティショニングのみサポートされています。RANGEとHASHはサポートされていません。 -
パーティションキーには 1 列または 2 列を含めることができます。
-
サポートされているパーティションキーのデータ型:
INT、TEXT、VARCHAR、DATE、TIMESTAMP、TIMESTAMPTZ。 -
パーティションキーは
NOT NULLである必要があります。 -
論理パーティションテーブルのパーティションキーは 生成列 をサポートしています。
-
1 つの論理パーティションテーブルは最大 5,200 パーティションをサポートします。データベース全体では論理パーティションの合計が最大 200,000 です。
バッチインポートの制限
| シナリオ | しきい値 | 動作 |
|---|---|---|
| 単一のバッチインポートジョブ | > 50 パーティション | エラー: 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 億行未満のパーティションは避けてください。粒度が細かいパーティションはクエリの高速化の効果を低下させ、小さなファイルが蓄積するリスクを高めます。例えば、大量データのワークロードでは日単位のパーティショニングは妥当ですが、クライアント ID や 1 時間未満の間隔によるパーティショニングは通常、粒度が細かすぎます。
-
書き込みパターン: パーティションには順次データを書き込んでください。多数のパーティションに同時に書き込むことは避けてください。
-
データ品質: 取り込むデータをクリーンに保ってください。日単位のパーティションを使用している場合にタイムスタンプが 0 時ちょうどになっていないなどの不正データは、想定外のパーティション増加を引き起こす可能性があります。
-
パーティションライフサイクル: パーティションを手動で作成または削除しないでください。パーティションはデータを含む場合にのみ存在します。パーティション内のすべてのデータが削除されると、Hologres は非同期にパーティションを削除します。
-
TRUNCATE とバイナリログ: TRUNCATE はバイナリログを生成しません。セッションのバイナリログ生成を無効にするには、TRUNCATE の前に
SET hg_experimental_generate_binlog = offを実行してください。 -
テーブルプロパティの変更: 論理パーティションテーブルのテーブルプロパティを変更するには、REBUILD 構文を使用してください。バックエンドはタスクを自動的に分割し、パーティション単位で順次実行します。リシャーディング操作 (例:テーブルを別の Table Group に移動) の場合は、
HG_MOVE_TABLE_TO_TABLE_GROUPストアドプロシージャを使用しないでください。正しい手順については、「Table Group and Shard Count Operation Guide」をご参照ください。
論理パーティションテーブルの作成
構文
-- 論理パーティションの親テーブルを作成します
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_time_format |
None | 備考を参照 | パーティションキーが TEXT の場合にのみ必要です。Hologres V4.2 以降でサポートされています。有効な値:
説明
このプロパティは、 |
partition_expiration_time |
None (自動クリーンアップなし) | '30 day'、'12 month' など |
パーティションキーと同じ時間単位を使用してください。 説明
|
partition_keep_hot_window |
すべてのデータがホットのまま | '30 day'、'12 month' など |
このウィンドウ外のデータは非同期にコールドストレージへ移動されます。「Data tiering storage」をご参照ください。 説明
|
partition_require_filter |
FALSE |
TRUE、FALSE |
TRUE の場合、親テーブルに対するクエリにはパーティションフィルター条件を含める必要があります。含まれないクエリは失敗します。 |
binlog_level |
'none' |
'none'、'replica' |
親テーブルのバイナリログを有効または無効にします。「Subscribe to Hologres binary logging」をご参照ください。 |
binlog_ttl |
2592000 (30 日、秒単位) |
Integer (秒) | バイナリログデータの TTL (time-to-live) です。 |
partition_generate_binlog_window |
None (すべてのデータがバイナリログを生成) | '3 day'、'12 hour' など |
ウィンドウ内に作成されたパーティションのデータのみがバイナリログを生成します。単一の時間ベースのパーティションキーを持つテーブルにのみ適用されます。 |
その他のプロパティ (インデックス、orientation など) |
— | — | 論理パーティションテーブルは distribution_key、clustering_key、orientation、time_to_live_in_seconds など、標準のプロパティをサポートしています。「CREATE TABLE」および「Scenario-based table creation optimization guide」をご参照ください。物理パーティションテーブルの動的パーティション管理プロパティはサポートされません。「Dynamic partition management」をご参照ください。 |
パーティションプロパティ
これらのプロパティは個々のパーティションに適用されます。ALTER LOGICAL PARTITION TABLE を使用して変更します。
| プロパティ | デフォルト | 有効な値 | 動作 |
|---|---|---|---|
keep_alive |
FALSE |
TRUE、FALSE |
TRUE の場合、親テーブルに partition_expiration_time が設定されていても、このパーティションは自動的にクリーンアップされません。 |
storage_mode |
未設定 (親の partition_keep_hot_window に従う) |
'hot'、'cold' |
このパーティションについて、親テーブルの partition_keep_hot_window を上書きします。 |
generate_binlog |
未設定 (親の partition_generate_binlog_window に従う) |
'on'、'off' |
このパーティションについて、親テーブルの partition_generate_binlog_window を上書きします。 |
例
例 1: 通常の列をパーティションキーとして使用
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'
);
例 2: 生成列をパーティションキーとして使用
パーティションキー ds は、date_trunc を使用して c 列から導出されます。これにより、呼び出し元がパーティション値を計算しなくても、各行が自動的に正しい日次パーティションに割り当てられます。詳細については、「Hologres の生成列」をご参照ください。
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'
);
例 3: 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
);
データの管理
ロックの粒度
| 操作 | ロックタイプ | 備考 |
|---|---|---|
| 指定したパーティションへのバッチインポートまたは更新、INSERT OVERWRITE、指定したパーティションに対する TRUNCATE | パーティションロック | ローカルインスタンスまたはコンピューティンググループのリソースを使用して実行する場合:パーティションロック。他のパーティションは影響を受けません。Serverless リソースを使用して実行する場合:V4.2 より前はテーブルロック、V4.2 以降はパーティションロックです。 |
| パーティションを指定しないバッチインポートまたは更新、パーティションを指定しない TRUNCATE、任意の DELETE | テーブルロック | 他のデータ管理操作は、ロックが解放されるまで待機します。 |
| Fixed Plan の書き込み、更新、または削除 | 行ロック | バッチインポート、更新、または削除と競合します。他の Fixed Plan 操作とは競合しません。 |
データクリーンアップ方法の選択
| 方法 | 使用するタイミング | ロックタイプ | 備考 |
|---|---|---|---|
DELETE |
条件に一致する行を選択的に削除する場合 | テーブルロック | 大規模データセットでは低速です |
TRUNCATE (パーティションレベル) |
1 つまたは複数の特定パーティション内のすべてのデータを削除する場合 | パーティションロック | DELETE より高速です。バイナリログは生成されません。コンピューティンググループ DML ではサポートされません — リーダーコンピューティンググループを使用してください |
TRUNCATE (テーブルレベル) |
親テーブル内のすべてのデータを削除する場合 | テーブルロック | 完全クリーンアップでは最速です。バイナリログは生成されません |
INSERT OVERWRITE |
パーティション内のすべてのデータを新しいデータで置き換える場合 | パーティションロック (パーティション単位) | 同期的です。複数のパーティションを指定した場合は並列に処理されます — CPU とメモリの使用量を抑えるため、順次タスクに分割してください |
親テーブルへの書き込み
データの書き込み、更新、クリーンアップの操作は標準テーブルと同様に動作します。Hologres はデータに基づいてパーティションを自動的に作成または削除します。
-- データを書き込みます。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 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', 1, '2025-03-16 10:00:00', '2025-03-16'),
('b', 2, '2025-03-17 11:00:00', '2025-03-17');
パーティションデータのクリーンアップ
-- 特定パーティションから行を削除します (テーブルロック)
DELETE FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16' or ds = '2025-03-17';-- 特定パーティションを TRUNCATE します (パーティションロック、バイナリログは生成されません)
-- コンピューティンググループ DML ではサポートされません。リーダーコンピューティンググループで実行してください。
SET hg_experimental_generate_binlog = off;
TRUNCATE public.hologres_logical_parent_1 PARTITION (ds = '2025-03-16') PARTITION (ds = '2025-03-17');
パーティションの上書き
Hologres 3.1 以降では、論理パーティションテーブル向けのネイティブ INSERT OVERWRITE 構文をサポートしています。「INSERT OVERWRITE」をご参照ください。
INSERT OVERWRITE は同期的です。複数の論理パーティションを指定した場合、Hologres はそれらを並列に処理するため、CPU とメモリの使用量が増加します。複数パーティションの上書きは、順次タスクに分割してください。
論理パーティションテーブルのクエリ
-- パーティションフィルター条件を指定してクエリします
SELECT * FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16';-- パーティションフィルター条件なしでクエリします
-- 親テーブルで partition_require_filter = FALSE が必要です
SELECT * FROM public.hologres_logical_parent_1;
partition_require_filter が TRUE に設定されている場合、パーティションフィルター条件のないクエリは失敗します。
メタデータの表示
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>');
いずれかのパーティションテーブルがパーティション制限を超えているかどうかを確認:
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();