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

Hologres:論理パーティションテーブルの作成

最終更新日:Jun 18, 2026

論理パーティションテーブルは、パーティションのライフサイクルを自動的に管理します。データが到着すると Hologres がパーティションを作成し、パーティションが空になると削除します。親テーブルは物理テーブルであり、各パーティションは個別の物理オブジェクトではなく論理的な概念です。

論理パーティションテーブルは、次のような場合に使用します。

  • データセットが大規模で、時系列またはカテゴリベース (日次ログ、イベントストリーム、テナントデータなど) の場合。

  • DDL のオーバーヘッドなしで、Hologres がパーティションの作成とクリーンアップを自動的に管理するようにしたい場合。

  • パーティションごとの有効期限、ホット/コールド階層化、または選択的な Binlog 生成が必要な場合。

TRUNCATE または INSERT OVERWRITE でパーティション全体を頻繁に置き換える場合は、物理パーティションテーブルの使用を推奨します。これらの操作は、大規模な削除を回避するため、物理パーティションの方が高速です。

論理パーティションテーブルには、Hologres 3.1 以降が必要です。

制限事項

  • LIST パーティション分割のみをサポートしています。 RANGEHASH はサポートされていません。

  • パーティションキーには、1 つまたは 2 つの列を指定できます。

  • サポートされているパーティションキーのデータ型: INTTEXTVARCHARDATETIMESTAMP、および 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' など パーティションキーと同じ時間単位を使用してください。
説明
  • 単一列のパーティションキーのみをサポートしています。

  • 時間タイプのパーティションキー (DATE、TIMESTAMP、TIMESTAMPTZ) の場合、partition_time_format の設定は不要です。

  • Hologres V4.2 以降では、TEXT パーティションキーをサポートしています。 partition_time_format を設定して、TEXT 値が時間をどのようにエンコードするかを指定してください。

partition_keep_hot_window すべてのデータがホットのまま '30 day', '12 month' など このウィンドウ外のデータは、非同期でコールドストレージに移動されます。詳細については、データ階層化ストレージをご参照ください。
説明
  • 単一列のパーティションキーのみをサポートしています。

  • 時間タイプのパーティションキー (DATE、TIMESTAMP、TIMESTAMPTZ) の場合、partition_time_format の設定は不要です。

  • Hologres V4.2 以降では、TEXT パーティションキーをサポートしています。 partition_time_format を設定して、TEXT 値が時間をどのようにエンコードするかを指定してください。

partition_time_format なし 下記参照 パーティションキーが TEXT の場合にのみ必要です。 Hologres V4.2 以降でサポートされています。有効な値:
  • YYYYMMDDHH24 :時間単位の粒度、例: 2024112221

  • YYYYMMDD :日単位の粒度、例: 20241122

  • YYYYMM :月単位の粒度、例: 202411

  • YYYYQ :四半期単位の粒度、例: 20241202422024320244

  • YYYY :年単位の粒度、例: 20232024

  • YYYY-MM-DD-HH24 :区切り文字付きの時間単位、例: 2024-11-22-21

  • YYYY-MM-DD :区切り文字付きの日単位、例: 2024-11-22

  • YYYY-MM :区切り文字付きの月単位、例: 2024-11

  • YYYY-Q :区切り文字付きの四半期単位、例: 2024-1

partition_require_filter FALSE TRUEFALSE 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_keyclustering_keyorientationtime_to_live_in_seconds、およびその他の標準プロパティをサポートしています。詳細については、CREATE TABLE および シナリオベースのテーブル作成最適化ガイドをご参照ください。物理パーティションテーブルの動的パーティション管理プロパティはサポートされていません。詳細については、動的パーティション管理をご参照ください。

パーティションプロパティ

これらのプロパティは個々のパーティションに適用されます。これらを変更するには、 ALTER LOGICAL PARTITION TABLE を使用してください。

プロパティ デフォルト 有効な値 動作
keep_alive FALSE TRUEFALSE 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_filterTRUE に設定されている場合、パーティションフィルター条件のないクエリは失敗します。

メタデータの表示

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

次のステップ