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

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

最終更新日:Feb 15, 2026

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)および非同期でのクリーンアップタイミングです。

  • デフォルトでは、有効期限は設定されていません。データは自動的にクリーンアップされません。

  • `'30 day'` や `'12 month'` のような値を設定できます。パーティションキーと同じ時間単位を使用することを推奨します。

説明

このプロパティは、単一のパーティションキーを持つテーブル、および時系列に基づくパーティションキーにのみ適用されます。

partition_keep_hot_window

パーティションデータがホットストレージに保持される期間です。この期間が経過すると、パーティションデータは非同期でコールドストレージに移動されます。「ホットストレージ/コールドストレージ」の詳細については、「データ階層化ストレージ」をご参照ください。

  • デフォルトでは、すべてのデータがホットのままです。コールドストレージへの自動移動は発生しません。

  • `'30 day'` や `'12 month'` のような値を設定できます。パーティションキーと同じ時間単位を使用することを推奨します。

説明

このプロパティは、単一のパーティションキーを持つテーブル、および時系列に基づくパーティションキーにのみ適用されます。

partition_require_filter

親テーブルに対するクエリでパーティションフィルター条件を必須とするかどうかです。有効な値は以下のとおりです:

  • `TRUE`:パーティションフィルター条件が必須です。条件を指定しないクエリは失敗します。

  • `FALSE`(デフォルト):パーティションフィルター条件は任意です。親テーブルを直接クエリできます。

binlog_level

親テーブルに対するバイナリログ(Binlog)の有効化設定です。「バイナリログ機能」の詳細については、「Hologres バイナリログの購読」をご参照ください。デフォルト値:`none`。有効な値は以下のとおりです:

  • `'none'`(デフォルト):Binlog は無効です。

  • `'replica'`:Binlog は有効です。

binlog_ttl

Binlog データの生存時間(TTL)(秒単位)です。デフォルト値は 2592000(30 日)です。

partition_generate_binlog_window

データが Binlog を生成するタイムウィンドウです。「現在時刻 − この値」以内に作成されたパーティションのデータのみが Binlog を生成します。

  • デフォルトでは、タイムウィンドウは設定されていません。親テーブル内のすべてのデータが Binlog を生成します。

  • `'3 day'` や `'12 hour'` のような値を設定できます。パーティションキーと同じ時間単位を使用することを推奨します。

説明

このプロパティは、単一のパーティションキーを持つテーブル、および時系列に基づくパーティションキーにのみ適用されます。

その他の重要なプロパティ(例:インデックス)

論理パーティションテーブルは、`distribution_key` や `clustering_key` などのインデックス、および `orientation` や `time_to_live_in_seconds` などのその他の重要なプロパティをサポートします。

プロパティの詳細については、「CREATE TABLE」をご参照ください。インデックス関連のテーブルプロパティに適切な値を設定するには、「シナリオ別テーブル作成最適化ガイド」をご参照ください。

論理パーティションテーブルは、従来の物理パーティションテーブルの動的パーティション管理プロパティをサポートしません。詳細については、「動的パーティション管理」をご参照ください。

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

論理パーティションテーブルのパーティションは、以下のプロパティをサポートします。これらのプロパティは、ALTER LOGICAL PARTITION TABLE を使用して変更できます。

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

説明

keep_alive

パーティションが自動的にクリーンアップされるかどうかです。有効な値は以下のとおりです:

  • `TRUE`:パーティションは自動的にクリーンアップされません。親テーブルの `partition_expiration_time` 設定を無視します。

  • `FALSE`(デフォルト):パーティションは親テーブルの `partition_expiration_time` 設定に従い、有効期限が切れた時点でクリーンアップされます。

このプロパティは、親テーブルに `partition_expiration_time` が設定されている場合にのみ有効です。

storage_mode

パーティションが特定のストレージクラスを使用するかどうかです。デフォルトでは、このプロパティは設定されていません。未設定の場合、パーティションは親テーブルの `partition_keep_hot_window` 設定に従います。有効な値は以下のとおりです:

  • `'hot'`:パーティションはホットストレージに保持されます。親テーブルの `partition_keep_hot_window` 設定を無視します。

  • `'cold'`:パーティションはコールドストレージに保持されます。親テーブルの `partition_keep_hot_window` 設定を無視します。

generate_binlog

パーティションが Binlog を生成するかどうかです。デフォルトでは、このプロパティは設定されていません。未設定の場合、パーティションは親テーブルの `partition_generate_binlog_window` 設定に従います。有効な値は以下のとおりです:

  • `'on'`:パーティションは Binlog を生成します。親テーブルの `partition_generate_binlog_window` 設定を無視します。

  • `'off'`:パーティションは 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();

参考資料