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

Hologres:CREATE LOGICAL PARTITION TABLE

最終更新日:Nov 12, 2025

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

パーティションの有効期限。パーティションの有効期限が切れると、そのデータは非同期でクリアされます。

  • デフォルトでは、パーティションは有効期限切れにならず、データは自動的にクリアされません。

  • '30 day''12 month' などの値を設定できます。このパラメーターの時間単位は、パーティションキーの単位と一致する必要があります。

説明

このプロパティは、時間ベースのデータ型の単一のパーティションキーにのみ適用されます。

partition_keep_hot_window

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

  • デフォルトでは、すべてのデータはホットストレージにあり、自動的にコールドストレージに移動されることはありません。

  • '30 day''12 month' などの値を設定できます。このパラメーターの時間単位は、パーティションキーの単位と一致する必要があります。

説明

このプロパティは、時間ベースのデータ型の単一のパーティションキーにのみ適用されます。

partition_require_filter

親テーブルをクエリするときにパーティションキーのフィルター条件が必要かどうかを指定します。有効な値:

  • TRUE: フィルター条件が必要です。それ以外の場合は、エラーが返されます。

  • FALSE (デフォルト): フィルター条件は必要ありません。親テーブルを直接クエリできます。

binlog_level

親テーブルのバイナリログを有効にするかどうかを指定します。バイナリログ機能の詳細については、「Hologres バイナリログのサブスクライブ」をご参照ください。有効な値:

  • 'none' (デフォルト): バイナリログを無効にします。

  • 'replica': バイナリログを有効にします。

binlog_ttl

バイナリログデータの存続時間 (TTL) (秒単位)。デフォルト値は 2592000 で、これは 30 日です。

partition_generate_binlog_window

親テーブルデータのバイナリログを生成するためのタイムウィンドウ。バイナリログは、`現在の時間 - パラメーター値` の範囲内にあるパーティションのデータに対してのみ生成されます。

  • デフォルトでは、タイムウィンドウは設定されていません。つまり、親テーブルのすべてのデータのバイナリログが生成されます。

  • '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

パーティションのバイナリログを生成するかどうかを指定します。デフォルトでは、このプロパティは設定されておらず、パーティションは親テーブルの partition_generate_binlog_window パラメーターによって制御されます。有効な値:

  • 'on': パーティションのバイナリログが生成されます。親テーブルの partition_generate_binlog_window パラメーターの影響を受けません。

  • 'off': パーティションのバイナリログは生成されません。親テーブルの 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('<スキーマ名>.<テーブル名>');

関連ドキュメント