Hologres の動的パーティション機能は、テーブル作成時に設定したルールに基づき、子パーティションを自動的に作成・管理します。事前にすべてのパーティションを定義する必要はありません。また、この機能では、条件を満たすデータを低頻度アクセスストレージデバイスに移行することで、クエリパフォーマンスを維持しつつストレージ費用を削減できます。
機能概要
以下のリストは、Hologres の各バージョンにおける機能サポート状況を示しています。
Hologres V1.3 以降では、動的パーティションルールを設定できます。システムはこれらのルールに基づき、定期的にスケジュールタスクを実行し、子パーティションを事前作成または期限切れのものを削除します。
Hologres V1.3.37 以降では、ホットデータとコールドデータの階層型ストレージ(Tiered Storage)の動的管理がサポートされます。この機能により、データが自動的にコールドストレージに移行され、ストレージコストを削減できます。詳細については、「階層型ストレージ」をご参照ください。
Hologres V2.1.11 以降では、パーティションキーとして Date 型がサポートされます。
Hologres V2.2 以降では、動的パーティション設定テーブルに
schd_start_timeプロパティを使用して、パーティションのスケジュール時間をカスタマイズできます。これにより、パーティションの作成・削除・コールドストレージへの移行を任意の時間に設定できます。Hologres V3.0.12 以降では、新しい
auto_partitioning_time_formatパラメーターが利用可能になります。このパラメーターを使用して、パーティションキーの日時フォーマットを指定できます。たとえば、YYYY-MM-DD 形式でパーティションを作成するよう指定できます。
注意事項
Hologres では、親テーブルではなく子テーブルに直接データをインポートできます。
説明Realtime Compute for Apache Flink を使用すると、Hologres の親テーブルにリアルタイムでデータをインポートできます。詳細については、「パーティション化された Hologres 結果テーブルにリアルタイムでデータを書き込む」をご参照ください。
1 つのパーティションルールで作成できるパーティションテーブルは 1 つだけです。
PARTITION BY句では、リストパーティションのみがサポートされます。パーティションキーは単一カラムである必要があります。パーティションテーブルにプライマリキーが設定されている場合、パーティションキーはプライマリキーのサブセットである必要があります。
動的パーティション機能では、スケジュール時間 (
schd_start_time) の設定は親テーブルに対してのみ可能です。子パーティションには設定できません。auto_partitioning_time_formatパラメーターは一度しか設定できず、設定後は変更できません。新規テーブルでは、CREATE TABLE 文でこのパラメーターを設定してください。既存テーブルでは変更できません。auto_partitioning_time_formatパラメーターで日時フォーマットを指定した場合、子パーティションの命名フォーマットはパーティションキーの日付フォーマットに従います。子パーティションをクエリする際は、子テーブル名を二重引用符で囲む必要があります。例:SELECT xxx FROM "tbl_2024_11_22"。
動的パーティションの設定
構文説明
パーティションテーブル作成時に動的パーティション管理プロパティを設定するか、テーブル作成後に変更できます。構文は以下のとおりです。
WITH 句を使用した例
パーティションテーブル作成時に動的パーティション管理プロパティを設定します。
-- パーティションテーブル作成時に動的パーティション管理プロパティを設定します。 CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> ([ { <column_name> <column_type> [ <column_constraints>, [...]] | <table_constraints> [, ...] } ]) PARTITION BY LIST(<column_name>) WITH ( auto_partitioning_enable = 'xxx', auto_partitioning_time_unit = 'xxx', auto_partitioning_time_zone = 'xxx', auto_partitioning_num_precreate = 'xxx', auto_partitioning_num_retention = 'xxx', auto_partitioning_num_hot='xxx', -- 注: schd_start_time パラメーターは Hologres V2.2 以降でサポートされます。 auto_partitioning_schd_start_time = 'xxx', -- 注: time_format パラメーターは Hologres V3.0.12 以降でサポートされます。 auto_partitioning_time_format = 'xxx' );パーティションテーブル作成後に動的パーティション管理プロパティを変更します。
-- 動的パーティション管理プロパティを変更します。 ALTER TABLE [<schema_name>.]<table_name> SET ( auto_partitioning_enable = 'xxx', auto_partitioning_time_unit = 'xxx', auto_partitioning_time_zone = 'xxx', auto_partitioning_num_precreate = 'xxx', auto_partitioning_num_retention = 'xxx', auto_partitioning_num_hot='xxx', -- 注: schd_start_time パラメーターは Hologres V2.2 以降でサポートされます。 auto_partitioning_schd_start_time = 'xxx', -- 注: time_format パラメーターは Hologres V3.0.12 以降でサポートされます。 auto_partitioning_time_format = 'xxx' );
CALL 文を使用した例
パーティションテーブル作成時に動的パーティション管理プロパティを設定します。
-- パーティションテーブル作成時に動的パーティション管理プロパティを設定します。 BEGIN; CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> ([ { <column_name> <column_type> [ <column_constraints>, [...]] | <table_constraints> [, ...] } ]) PARTITION BY LIST(<column_name>); CALL set_table_property('[<schema_name>.]<table_name>', 'auto_partitioning.enable', 'xxx'); CALL set_table_property('[<schema_name>.]<table_name>', 'auto_partitioning.time_unit', 'xxx'); CALL set_table_property('[<schema_name>.]<table_name>', 'auto_partitioning.time_zone', 'xxx'); CALL set_table_property('[<schema_name>.]<table_name>', 'auto_partitioning.num_precreate', 'xxx'); CALL set_table_property('[<schema_name>.]<table_name>', 'auto_partitioning.num_retention', 'xxx'); CALL set_table_property('[<schema_name>.]<table_name>', 'auto_partitioning.num_hot', 'xxx'); -- 注: schd_start_time パラメーターは Hologres V2.2 以降でサポートされます。 CALL set_table_property ('[<schema_name>.]<table_name>', 'auto_partitioning.schd_start_time', 'xxx'); -- 注: time_format パラメーターは Hologres V3.0.12 以降でサポートされます。 CALL set_table_property ('[<schema_name>.]<table_name>', 'auto_partitioning.time_format', 'xxx'); COMMIT;パーティションテーブル作成後に動的パーティション管理プロパティを変更します。
-- 動的パーティション管理プロパティを変更します。 CALL set_table_property('[<schema_name>.]<table_name>', 'auto_partitioning.enable', 'xxx'); CALL set_table_property('[<schema_name>.]<table_name>', 'auto_partitioning.num_precreate', 'xxx'); CALL set_table_property('[<schema_name>.]<table_name>', 'auto_partitioning.num_retention', 'xxx'); -- 注: time_format パラメーターは Hologres V3.0.12 以降でサポートされます。 CALL set_table_property('[<schema_name>.]<table_name>', 'auto_partitioning.time_format', 'xxx');
パラメーター説明
CREATE TABLE WITH 構文を使用して動的パーティションを設定する場合、パラメーター名のピリオド (.) をアンダースコア (_) に置き換えてください。たとえば、auto_partitioning.enable を auto_partitioning_enable に変更します。
パラメーター名 | 必須 | 説明 | 更新可 | バージョン要件 |
| いいえ | 動的パーティション管理を有効にするかどうかを指定します。有効値:
| はい | Hologres V1.3 以降 |
| はい | 動的パーティションの時間単位を指定します。有効値:
たとえば、このパラメーターを DAY に設定すると、パーティションは日単位で事前作成および削除されます。 | いいえ | |
| いいえ | 動的パーティションのタイムゾーンを指定します。デフォルト値は現在の接続のタイムゾーンです。このパラメーターを設定すると、指定されたタイムゾーンの時刻に基づいて動的パーティション管理が実行されます。 次の SQL 文を実行して、利用可能なタイムゾーンとそのオフセットを確認できます。name 列の値が timezone の値(例:Asia/Shanghai)となります。 | いいえ | |
| いいえ | 事前作成するパーティション数を指定します。有効値:
説明 たとえば、現在時刻が 2022-01-10 の場合、 重要 パーティションの事前作成は、MAX_PT 関数の動作に影響します。このパラメーターを設定する前に、ワークロードが MAX_PT 関数に依存しているかどうかを確認してください。 | はい | |
| いいえ | 保持する履歴パーティション数を指定します。有効値:
説明 たとえば、現在日付が 2022-01-10 で、 | はい | |
| いいえ | 保持するホットパーティション数を指定します。有効値:
| Hologres V1.3.37 以降 | |
| いいえ | カスタムパーティションスケジュール時間を指定します。 このパラメーターを使用してスケジュール時間を変更できます。サポートされる日時フォーマットについては、「Date/Time Types」をご参照ください。将来の時刻を設定した場合、その時刻に設定が有効になります。 | Hologres V2.2 以降 | |
| いいえ | テーブル作成時のパーティションキーの日時フォーマットを指定します。
| いいえ | Hologres V3.0.12 以降 |
テーブル名の生成ルール
auto_partitioning.time_unit パラメーターが HOUR、DAY、MONTH、QUARTER、または YEAR に設定されている場合、動的パーティションは親テーブル名に時間サフィックスを付加した形式で新しいパーティション名を生成します。形式は {parent_table}_{time_suffix} です。時間サフィックスは、自動パーティションのスケジュール時間と時間単位に対応するフォーマットテンプレートに基づいて生成されます。具体的なマッピングは以下のとおりです。
時間単位 | 時間サフィックスフォーマット | 例 | 実行時間 |
HOUR | YYYYMMDDHH24 | 2024112221. | 毎時開始時に実行されます。たとえば、2024 年 11 月 22 日 21:00:01 にタスクが実行されます。 |
YYYY-MM-DD-HH24 | 2024-11-22-21. | ||
DAY | YYYYMMDD | 20241122. | 毎日 00:00:01 に実行されます。たとえば、2024 年 11 月 22 日 00:00:01 です。 |
YYYY-MM-DD | 2024-11-22. | ||
MONTH | YYYYMM | 202411. | 毎月 1 日の 00:00:01 に実行されます。たとえば、2024 年 11 月 1 日 00:00:01 です。 |
YYYY-MM | 2024-11. | ||
QUARTER | YYYYQ | 20241、20242、20243、20244 は 2024 年の第 1~4 四半期を表します。 | 各四半期の初日の 00:00:01 に実行されます。たとえば、2024 年 1 月 1 日 00:00:01 です。 |
YYYY-Q | 2024-1、2024-2、2024-3、2024-4 は 2024 年の第 1~4 四半期を表します。 | ||
YEAR | YYYY | 2023 および 2024 はそれぞれ 2023 年および 2024 年のパーティションを表します。 | 毎年 1 月 1 日の 00:00:01 に実行されます。たとえば、2023 年 1 月 1 日 00:00:01 です。 |
使用例
以下の例では、時間単位を DAY に設定し、翌日以降 3 日分のパーティションを事前作成し、過去 2 日分の履歴パーティションを保持し、タイムゾーンを Asia/Shanghai に設定します。
WITH 句を使用した例
パーティションテーブル
tbl1を作成します。-- V2.1 でパーティションテーブルを作成し、動的パーティション管理を設定します: CREATE TABLE tbl1 ( c1 TEXT NOT NULL, c2 TEXT ) PARTITION BY LIST (c2) WITH ( auto_partitioning_enable = 'true', auto_partitioning_time_unit = 'DAY', auto_partitioning_time_zone = 'Asia/Shanghai', auto_partitioning_num_precreate = '3', auto_partitioning_num_retention = '2' );子パーティションが生成された後、データを挿入します。
INSERT INTO tbl1 (c1, c2) VALUES ('Data 1', '20231212'); INSERT INTO tbl1 (c1, c2) VALUES ('Data 2', '20231213'); INSERT INTO tbl1 (c1, c2) VALUES ('Data 3', '20231214');データをクエリします。
SELECT * FROM tbl1 WHERE c2='20231212';以下の結果が返されます。
c1 c2 Data 1 20231212
CALL 文を使用した例
パーティションテーブル
tbl1を作成します。-- パーティションテーブルを作成し、動的パーティション管理を設定します: BEGIN; CREATE TABLE tbl1 ( c1 TEXT NOT NULL, c2 TEXT ) PARTITION BY LIST (c2); CALL set_table_property ('tbl1', 'auto_partitioning.enable', 'true'); CALL set_table_property ('tbl1', 'auto_partitioning.time_unit', 'DAY'); CALL set_table_property ('tbl1', 'auto_partitioning.time_zone', 'Asia/Shanghai'); CALL set_table_property ('tbl1', 'auto_partitioning.num_precreate', '3'); CALL set_table_property ('tbl1', 'auto_partitioning.num_retention', '2'); COMMIT;子パーティションが生成された後、データを挿入します。
INSERT INTO tbl1 (c1, c2) VALUES ('Data 1', '20231212'); INSERT INTO tbl1 (c1, c2) VALUES ('Data 2', '20231213'); INSERT INTO tbl1 (c1, c2) VALUES ('Data 3', '20231214');データをクエリします。
SELECT * FROM tbl1 WHERE c2='20231212';以下の結果が返されます。
c1 c2 Data 1 20231212
パーティションの追加および削除のロジックは以下のとおりです。
時刻 | イベント | 結果 |
2023-12-12 09:00:00 | 上記の SQL 文を実行してパーティションテーブルを作成します。 |
|
2023-12-13 00:00:00 | システムが自動的に子パーティションを作成します。 |
|
2023-12-14 00:00:00 | システムが自動的に子パーティションを作成します。 |
|
2023-12-15 00:00:00 | システムが自動的に子パーティションを作成およびパージします。 |
|
2023-12-16 00:00:00 | システムが自動的に子パーティションを作成およびパージします。 |
|
一般的なユースケース
特定の子パーティションを保持する
デフォルトでは、システムは設定された動的パーティションルールに基づき、子パーティションを自動的に作成および削除します。保持範囲外の子パーティションは自動的に削除されます。ただし、一部のシナリオでは重要なパーティションのデータを保持する必要があります。たとえば、EC シナリオでは、毎年の独身の日のデータを前年比や前月比分析のために保持する必要がある場合があります。keep_alive プロパティをテーブルに追加することで、特定の子パーティションを保持できます。構文は以下のとおりです。
V2.1 以降でサポートされる構文:
-- パーティションを保持 ALTER TABLE [<schema_name>.]<table_name> SET (keep_alive = 'true'); -- パーティションの保持を停止:保持プロパティを削除すると、動的パーティション管理が直ちに期限切れデータのパージをトリガーします。 ALTER TABLE [<schema_name>.]<table_name> SET (keep_alive = 'false');すべてのバージョンでサポートされる構文:
-- パーティションを保持 CALL set_table_property('[<schema_name>.]<table_name>', 'keep_alive', 'true'); -- パーティションの保持を停止:保持プロパティを削除すると、動的パーティション管理が直ちに期限切れデータのパージをトリガーします。 CALL set_table_property('[<schema_name>.]<table_name>', 'keep_alive', 'false');説明table_name は実際の子パーティション名に置き換えてください。
パーティションテーブルの記憶媒体を動的に管理する
パーティションテーブルを扱う際、ホットデータとコールドデータの階層型ストレージを使用することで、コストとパフォーマンスのバランスを効果的に取れます。たとえば、最新の N 個の履歴パーティションをホットストレージに動的に保持して頻繁なクエリ要求に対応し、それより古い M 個のパーティションをコールドストレージに格納してコストを削減できます。このシナリオは、動的パーティション管理機能を使用して、N+M 個より古いデータを削除することで実現できます。
動的パーティションテーブルの作成
例:1 日あたり 1 つのパーティションを作成します。最新の 7 個の履歴パーティションをホットストレージに動的に保持します。7 日より古い次の 23 個のパーティションをコールドストレージに格納します。この範囲より古いパーティションは削除します。以下のコードがその例です。
BEGIN;
CREATE TABLE tbl2(
c1 text not null,
c2 text
)
PARTITION BY LIST(c2);
CALL set_table_property('tbl2', 'auto_partitioning.enable', 'true');
CALL set_table_property('tbl2', 'auto_partitioning.time_unit', 'DAY');
CALL set_table_property('tbl2', 'auto_partitioning.num_precreate', '3');
CALL set_table_property('tbl2', 'auto_partitioning.num_hot', '7');
CALL set_table_property('tbl2', 'auto_partitioning.num_retention', '30');
COMMIT;効果を以下の図に示します。

ストレージポリシーの変更
auto_partitioning.num_hot パラメーターの値を変更することで、ホットストレージのパーティションポリシーを変更できます。ただし、このポリシーを変更しても、すでにコールドストレージにある子パーティションが自動的にホットストレージに移動することはありません。現在日付が 2022 年 7 月 1 日であると仮定して、以下のパーティションテーブルを作成します。
BEGIN;
CREATE TABLE tbl_p(
c1 text not null,
c2 text
)
PARTITION BY LIST(c2);
CALL set_table_property('tbl_p', 'auto_partitioning.enable', 'true');
CALL set_table_property('tbl_p', 'auto_partitioning.time_unit', 'DAY');
CALL set_table_property('tbl_p', 'auto_partitioning.num_precreate', '3');
CALL set_table_property('tbl_p', 'auto_partitioning.num_hot', '3');
CALL set_table_property('tbl_p', 'auto_partitioning.num_retention', '10');
COMMIT;この場合のデータ分布には、以下の 2 つのシナリオが考えられます。
シナリオ 1:ホットストレージパーティションポリシーの拡張
動的管理ポリシーのホットパーティション数を 4 に変更するには、以下のコードを実行します。
CALL set_table_property('tbl_p', 'auto_partitioning.num_hot', '4');すでにコールドストレージにある子パーティションは自動的にホットストレージに移動しないため、変更後の効果を以下の図に示します。

シナリオ 2:パーティションポリシーにおけるホットストレージのカットオフを縮小
動的管理ポリシーのホットパーティション数を 2 に変更するには、以下のコードを実行します。
CALL set_table_property('tbl_p', 'auto_partitioning.num_hot', '2');すでにコールドストレージにある子パーティションは自動的にホットストレージに移動しません。ただし、ホットからコールドに移動する必要のあるデータは移行されます。変更後の効果を以下の図に示します。

コールドストレージパーティションテーブルを動的パーティションテーブルに変更する
たとえば、コールドストレージプロパティを持つパーティションテーブルを動的パーティションテーブルに変更し、過去 7 日間のパーティションをホットストレージに設定するには、以下の方法を使用します。
データ準備。
-- テーブル作成時にストレージポリシーとしてコールドストレージを指定します。 BEGIN; CREATE TABLE tbl2( c1 TEXT NOT NULL, c2 TEXT ) PARTITION BY LIST(c2); CALL set_table_property('tbl2', 'storage_mode', 'cold'); CREATE TABLE tbl2_20230808 PARTITION OF tbl2 FOR VALUES IN('20230808'); CREATE TABLE tbl2_20230809 PARTITION OF tbl2 FOR VALUES IN('20230809'); CREATE TABLE tbl2_20230810 PARTITION OF tbl2 FOR VALUES IN('20230810'); CREATE TABLE tbl2_20230817 PARTITION OF tbl2 FOR VALUES IN('20230817'); COMMIT;テーブルを動的パーティションテーブルに変更し、過去 7 日間のパーティションをホットストレージに設定します。
BEGIN; CALL set_table_property('tbl2', 'storage_mode', 'hot'); -- 親テーブルをホットに設定。 CALL set_table_property('tbl2_20230810', 'storage_mode', 'cold'); -- ホットストレージに移動不要なパーティションをコールドに設定。 CALL set_table_property('tbl2_20230809', 'storage_mode', 'cold'); CALL set_table_property('tbl2_20230808', 'storage_mode', 'cold'); CALL set_table_property('tbl2', 'auto_partitioning.enable', 'true'); CALL set_table_property('tbl2', 'auto_partitioning.time_unit', 'DAY'); CALL set_table_property('tbl2', 'auto_partitioning.num_precreate', '3'); CALL set_table_property('tbl2', 'auto_partitioning.num_hot', '7'); CALL set_table_property('tbl2', 'auto_partitioning.num_retention', '10'); COMMIT;
動的パーティションの設定とスケジュール状態の確認
次の SQL 文を実行して、現在のデータベース内の動的パーティションテーブルとその設定情報をクエリします。
SELECT
nsp_name AS schema_name,
tbl_name AS table_name,
ENABLE,
time_unit,
time_zone,
num_precreate,
num_retention,
b.usename AS create_user,
cret_time,
schd_start_time,
options
FROM
hologres.hg_partitioning_config AS a
LEFT JOIN pg_user AS b ON a.cret_user = b.usesysid;以下にフィールドを説明します。
フィールド名 | 説明 |
schema_name | スキーマ名。 |
table_name | テーブル名。 |
ENABLE | 動的パーティション管理が有効かどうかを示します。 |
time_unit | 動的パーティションの時間単位。 |
time_zone | 動的パーティションのタイムゾーン。 |
num_precreate | 事前作成するパーティション数。 |
num_retention | 保持する履歴パーティション数。 |
create_user | ユーザーを作成できます。 |
cret_time | 作成時刻。 |
schd_start_time | 最新のスケジュール時刻。 |
以下の結果が返されます。

子パーティションの作成およびパージログの確認
クエリログには、子パーティションの作成およびパージに関するログは記録されません。次の SQL 文を実行して、これらのログをクエリします。
SELECT
relname,
relowner,
schdtime,
trigtime,
status,
message,
precreate,
discard
FROM
hologres.hg_partitioning_log 上記のフィールド名を以下に説明します。
フィールド名 | 説明 |
relname | schema.table |
relowner | パーティションテーブルのオーナー。 |
schdtime | スケジュール時刻。 |
trigtime | 実際のトリガー時刻。 |
status | ステータス。 |
message | 備考。 |
precreate | 作成された子パーティションの名前。 |
discard | パージされた子パーティションの名前。 |
以下の結果が返されます。

よくある質問
既存のパーティションテーブルに対して動的パーティションを有効にするにはどうすればよいですか?
次の SQL 文を使用して、既存のパーティションテーブルに対して動的パーティションを有効にできます。
-- Hologres V2.1 以降向けの SQL 例
ALTER TABLE auto_part_old SET (
auto_partitioning_enable = 'true',
auto_partitioning_time_unit = 'HOUR',
auto_partitioning_time_zone = 'PRC',
auto_partitioning_num_precreate = '4',
auto_partitioning_num_retention = '-1',
auto_partitioning_num_hot = '-1'
);
-- すべての Hologres バージョン向けの SQL 例
BEGIN;
CALL set_table_property('auto_part_old', 'auto_partitioning.enable', 'true');
CALL set_table_property('auto_part_old', 'auto_partitioning.time_unit', 'HOUR');
CALL set_table_property('auto_part_old', 'auto_partitioning.time_zone', 'PRC');
CALL set_table_property('auto_part_old', 'auto_partitioning.num_precreate', '4');
CALL set_table_property('auto_part_old', 'auto_partitioning.num_retention', '-1');
CALL set_table_property('auto_part_old', 'auto_partitioning.num_hot', '-1');
COMMIT;auto_partitioning.time_unit および auto_partitioning.time_zone パラメーターは、動的パーティション機能のコア設定です。Hologres をアップグレードした後、これらのパラメーターは一度しか設定できず、設定後は変更できません。
既存のパーティションテーブルに対して動的パーティションを有効にした後、履歴の子パーティションは自動パージロジックの影響を受けますか?
システムは子パーティションの名前に基づいてパージを実行します。子パーティションの名前が {parent_table}_{time_suffix} の命名規則に一致する場合、パージされます。一致しない場合は、パージされません。
動的パーティションテーブルを作成し、num_precreate を 3 に設定しました。SQL 文を実行した後、親テーブルは正常に作成されましたが、3 つの子パーティションは作成されませんでした。なぜですか?
動的パーティションの初期作成タスクは、デフォルトで 10 分ごとにチェックされます。そのため、子パーティションは 10 分以内に作成されます。しばらくしてから再度確認してください。