論理パーティションテーブルは、パーティションのライフサイクルを自動的に管理します。データが到着すると Hologres がパーティションを作成し、パーティションが空になると削除します。親テーブルは物理テーブルであり、各パーティションは個別の物理オブジェクトではなく論理的な概念です。
論理パーティションテーブルは、次のような場合に使用します。
-
データセットが大規模で、時系列またはカテゴリベース (日次ログ、イベントストリーム、テナントデータなど) の場合。
-
DDL のオーバーヘッドなしで、Hologres がパーティションの作成とクリーンアップを自動的に管理するようにしたい場合。
-
パーティションごとの有効期限、ホット/コールド階層化、または選択的な Binlog 生成が必要な場合。
TRUNCATE または INSERT OVERWRITE でパーティション全体を頻繁に置き換える場合は、物理パーティションテーブルの使用を推奨します。これらの操作は、大規模な削除を回避するため、物理パーティションの方が高速です。
論理パーティションテーブルには、Hologres 3.1 以降が必要です。
制限事項
-
LISTパーティション分割のみをサポートしています。RANGEとHASHはサポートされていません。 -
パーティションキーには、1 つまたは 2 つの列を指定できます。
-
サポートされているパーティションキーのデータ型:
INT、TEXT、VARCHAR、DATE、TIMESTAMP、およびTIMESTAMPTZ。 -
パーティションキーは
NOT NULLである必要があります。 -
論理パーティションテーブルのパーティションキーは、生成列をサポートしています。
-
単一の論理パーティションテーブルは最大 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 と Binlog: TRUNCATE は Binlog を生成しません。セッションの Binlog 生成を無効にするには、TRUNCATE の前に
SET hg_experimental_generate_binlog = offを実行してください。 -
テーブルプロパティの変更: 論理パーティションテーブルのテーブルプロパティを変更するには、REBUILD 構文を使用してください。バックエンドはタスクを自動的に分割し、パーティションごとに順次実行します。リシャーディング操作 (たとえば、テーブルを別の Table Group に移動する) の場合、
HG_MOVE_TABLE_TO_TABLE_GROUPストアドプロシージャは使用しないでください。正しいアプローチについては、Table Group とシャード数操作ガイドをご参照ください。
論理パーティションテーブルの作成
構文
-- 論理パーティションの親テーブルを作成
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 |
なし (自動クリーンアップなし) | '30 day', '12 month' など |
パーティションキーと同じ時間単位を使用してください。 説明
|
partition_keep_hot_window |
すべてのデータがホットのまま | '30 day', '12 month' など |
このウィンドウ外のデータは、非同期でコールドストレージに移動されます。詳細については、データ階層化ストレージをご参照ください。 説明
|
partition_time_format |
なし | 下記参照 | パーティションキーが TEXT の場合にのみ必要です。 Hologres V4.2 以降でサポートされています。有効な値:
|
partition_require_filter |
FALSE |
TRUE、FALSE |
TRUE の場合、親テーブルに対するクエリにはパーティションフィルター条件が必要です。条件のないクエリは失敗します。 |
binlog_level |
'none' |
'none'、'replica' |
親テーブルの Binlog を有効または無効にします。詳細については、Hologres バイナリロギングのサブスクライブをご参照ください。 |
binlog_ttl |
2592000 (30 日、秒単位) |
整数 (秒) | Binlog データの Time-to-Live (TTL)。 |
partition_generate_binlog_window |
なし (すべてのデータが Binlog を生成) | '3 day'、'12 hour' など |
ウィンドウ内で作成されたパーティションのデータのみが Binlog を生成します。単一の時間ベースのパーティションキーを持つテーブルにのみ適用されます。 |
その他のプロパティ (インデックス、 orientation など) |
— | — | 論理パーティションテーブルは、 distribution_key、 clustering_key、 orientation、 time_to_live_in_seconds、およびその他の標準プロパティをサポートしています。詳細については、CREATE TABLE および シナリオベースのテーブル作成最適化ガイドをご参照ください。物理パーティションテーブルの動的パーティション管理プロパティはサポートされていません。詳細については、動的パーティション管理をご参照ください。 |
パーティションプロパティ
これらのプロパティは個々のパーティションに適用されます。これらを変更するには、 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 より高速、Binlog を生成しない、コンピューティンググループの DML ではサポートされていない — リーダーコンピューティンググループを使用してください。 |
TRUNCATE (テーブルレベル) |
親テーブル内のすべてのデータを削除する | テーブルロック | 完全なクリーンアップには最速、Binlog を生成しない |
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 します (Binlog は生成されません)
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 します (パーティションロック、Binlog は生成されません)
-- コンピューティンググループの 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;
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 'テーブル %.% のパーティション数が制限を超えています (% > %)', 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();