大量のデータをインポートした後や、多数の DELETE または UPDATE 操作を実行した後は、データファイルの断片化により読み取りおよび書き込みパフォーマンスが低下する可能性があります。コンパクションは小さなデータファイルを大きなファイルにマージし、ストレージ効率を回復してクエリ速度を向上させます。
仕組み
Hologres は、データ書き込みに LSM ツリー (ログ構造化マージツリー) に類似したデータ構造を使用します。すべての書き込みは追記専用であり、ランダム書き込みをシーケンシャル書き込みに変換することで書き込みスループットを最大化します。時間の経過とともに多数の小さなファイルが生成されるため、コンパクションによるマージが必要になります。
Hologres は 2 種類のコンパクションをサポートしています:
-
自動コンパクション:最大 5 レベルの階層型コンパクションです。あるレベルに 5 個以上のファイルが蓄積されると、コンパクションが自動的にトリガーされ、結果が次のレベルへ移動します。たとえば、レベル 0 の 5 個のファイルは 1 つのファイル (デフォルトでは最大 64 MB) にマージされ、レベル 1 に移動します。自動コンパクションは同一レベル内のファイルのみをマージし、レベルをまたいだマージは行いません。
-
フルコンパクション:すべてのレベルにまたがるすべてのファイルを新しいファイル (デフォルトでは各 64 MB) にマージし、最終レベルに配置します。フルコンパクションは手動でトリガーする必要があります。

フルコンパクションを実行するタイミング
自動コンパクションは、通常のファイルマージをバックグラウンドで継続的に処理します。フルコンパクションは、自動コンパクションでは段階的に対処しきれないほど断片化が蓄積した場合にのみ実行してください。具体的には、次のいずれかの状況の後です:
-
大量のオフラインデータをインポートした場合
-
多数の
DELETEまたはUPDATE操作を実行した場合
フルコンパクションはリソース消費の大きい管理操作です。大量の I/O と CPU リソースを消費します。実行には通常 10 分以上かかります。ワークロードへの影響を最小限にするため、書き込みが少ない時間帯に実行してください。
フルコンパクションの実行
前提条件と制限事項
-
フルコンパクションには Hologres V2.1 以降が必要です。アップグレードするには、「Upgrade an instance」をご参照いただくか、「get online support」からアップグレードを依頼してください。
-
フルコンパクションをサポートするのは、列指向テーブルとハイブリッド行列表テーブルのみです。
-
ハイブリッド行列表テーブルでは、フルコンパクションはカラムストア部分にのみ適用されます。
構文
SELECT hologres.hg_full_compact_table(
'<schema_name.table_name>'
[,'max_file_size_mb=<value>']
);
パラメータ
|
パラメータ |
説明 |
必須 |
デフォルト |
|
|
コンパクションを実行するテーブルの名前 |
はい |
— |
|
|
各出力ファイルの最大サイズ (MB)。正の整数である必要があります。この値を小さくしすぎると小さなファイルが多く生成され、クエリが遅くなります。 必要な場合を除き、この値は変更しないでください。 |
いいえ |
64 |
例
public.lineitem に対してフルコンパクションを実行します:
SELECT hologres.hg_full_compact_table('public.lineitem');
public.lineitem に対して、出力ファイルの最大サイズを 256 MB にしてフルコンパクションを実行します:
SELECT hologres.hg_full_compact_table(
'public.lineitem',
'max_file_size_mb=256'
);
単一テーブルに対する自動コンパクションの調整
フルコンパクションは、手動で 1 回だけ実行する操作です。単一テーブルの自動コンパクションの動作を変更するには、そのテーブルにテーブルプロパティを設定します。これらのプロパティは、コンパクションの同時実行、ファイル選択、トリガー頻度を制御します。バルクロード中にコンパクションを一時停止したり、蓄積した小さなファイルを整理したり、バックグラウンドコンパクションによるリソース競合を緩和したりするために使用します。
前提条件と制限事項
-
これらのテーブルプロパティには Hologres V4.0 以降が必要です。以前のバージョンでは、設定しても効果はありません。先にインスタンスをアップグレードしてください。
-
これらのプロパティは、列指向テーブルとハイブリッド行列表テーブルにのみ適用されます。ハイブリッド行列表テーブルでは、カラムストア部分にのみ影響します。行指向テーブルに設定しても効果はありません。
-
多くの場合、自動コンパクションに手動介入は不要です。
online_config_compaction_semaphoreを除き、高度なプロパティは同時実行設定と相互作用し、その影響を予測しにくくなります。特定の問題に対処する場合にのみ、可能であればテクニカルサポートのガイダンスのもとで変更し、解決後はデフォルトに戻してください。
テーブルプロパティの設定、照会、リセット
SET_TABLE_PROPERTY を使用して、テーブルレベルのコンパクションプロパティを設定します。すべてのプロパティ名には online_config_ プレフィックスが付き、すべての値は文字列として渡します。新しい値は変更後にスケジュールされるコンパクションタスクに適用され、すでに実行中のタスクには影響しません。インスタンスの再起動やテーブルの再構築は不要です。
-- 構文
CALL SET_TABLE_PROPERTY('<schema_name>.<table_name>', 'online_config_<property_name>', '<value>');
-- public.orders でコンパクションのスケジューリングを一時停止
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', '0');
プロパティのリセット
プロパティを reset に設定すると、テーブルレベルの上書きを削除して、テーブルをインスタンスのデフォルトに戻します。
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', 'reset');
テーブルにすでに上書きが設定されており、その値にワークロードが依存している場合 (たとえば、意図的に 4 を設定している場合) は、reset ではなく、その値を書き戻してください。変更前に現在の状態を記録してください。「現在の設定の照会」をご参照ください。
現在の設定の照会
SELECT property_key, property_value
FROM hologres.hg_table_properties
WHERE table_namespace = '<schema_name>'
AND table_name = '<table_name>'
AND property_key LIKE 'online_config_%';
結果が空の場合、そのテーブルにはテーブルレベルの上書きがなく、インスタンスのデフォルトに従っていることを意味します。
コンパクションの同時実行制御
online_config_compaction_semaphore は、まず最初に使用すべきプロパティです。これは、テーブル単位ではなく タブレット単位 で同時実行されるコンパクションタスク数を制限します。タブレットは、コンパクションがスケジュールされる単位です。テーブルは各シャード上に 1 つ以上のタブレットを持ちます。ハイブリッド行列表テーブルでは、行ストア部分とカラムストア部分は別々のタブレットです。そのため、テーブル全体の理論上の上限はおおよそ tablet_count × property_value ですが、通常はワーカーレベルの同時実行上限と利用可能なリソースによって、より低い値に抑えられます。
|
値 |
動作 |
使用するタイミング |
|
0 |
このテーブルに対する新規コンパクションタスクのスケジューリングを停止します。 |
バルクロード前の一時的な期間。後で必ず値を戻してください。 |
|
1 |
最小限のマージ能力を維持します。 |
コンパクションがオンラインクエリに目に見えて影響しており、負荷を下げる必要がある場合。 |
|
2 |
デフォルト。 |
ほとんどすべてのワークロード。 |
|
3 ~ 8 |
マージのスループットを向上させます。 |
ファイルが蓄積し続けており、インスタンスに余剰リソースがある場合。値は 1 ずつ増やしてください。 |
値を 0 に設定した場合の実際の動作
-
このテーブルに対する新規コンパクションタスクはスケジュールされなくなります。
-
すでに実行中のタスクはキャンセルされません。通常どおり完了します。
-
すでにこのテーブル向けに選択され、実行待ちのタスクは、引き続きワーカーレベルの同時実行スロットを保持します。そのため、多数のテーブルを同時に 0 に設定すると、他のテーブルのコンパクションが実行できなくなります。
-
値を 0 より大きく戻すとキューに入ったタスクは再開しますが、スケジュールされなかったバックログが自動的に拾われる保証はありません。特に、テーブルに新規書き込みがない場合は顕著です。バックログを強制的に処理するために、
VACUUMを 1 回実行してください。VACUUMの具体的な動作については、「例」をご参照ください。
同時実行を復元し、バックログをマージするには次を実行します:
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', '2');
VACUUM public.orders;
論理パーティションテーブル
論理パーティションテーブルでは、Hologres はアクティブなパーティション数に比例して同時実行性を引き上げます。単一スケジューリング単位の上限は min(online_config_partition_table_compaction_semaphore_max, active_partition_count × online_config_compaction_semaphore) で、デフォルトの上限は 8 です。active_partition_count は実行時に測定されるため、設定可能なプロパティではありません。
リスク
-
値を 0 のまま長時間放置しないでください。ファイル数と削除済み行が増え続け、クエリ性能とストレージ使用量の両方が悪化します。バックログが大きくなるほど、最終的なマージ負荷も増大します。
-
多数のテーブルで同時に 0 に設定したり、同時に値を引き上げたりしないでください。すべてのテーブルはワーカーレベルの同時実行予算を共有します。一斉停止ではキューに入ったタスクが予算を占有し、一斉増加では全体的なキューイングとリソーススパイクを引き起こします。
-
変更は 1 回に 1 テーブル、1 プロパティに限定し、有効な最小単位で調整してください。次の変更の前に、業務の 1 サイクル全体を観測してください。
高度なプロパティ
次のプロパティは、コンパクションがファイルを選択する方法とトリガー頻度を変更します。これらは同時実行設定と相互作用するため、診断済みの特定の問題に対してのみ、可能であればテクニカルサポートのガイダンスのもとで変更し、解決後はデフォルトに戻してください。
|
プロパティ |
デフォルト |
説明 |
|
|
8 |
論理パーティションテーブルにおける、単一スケジューリング単位のコンパクション同時実行の上限です。「コンパクションの同時実行制御」に記載した式で |
|
|
5 |
単一のコンパクションタスクが選択する入力ファイルの最大数です。 |
|
|
5 |
コンパクションタスクをトリガーするために必要な候補ファイル数です。有効なしきい値は、この値と |
|
|
256 |
列指向テーブル、またはハイブリッド行列表テーブルのカラムストア部分に対して、単一のコンパクションタスクが選択するファイルの合計サイズ (MB) です。マージ後の出力サイズを間接的に決定します。 |
|
|
512 |
列指向でないデータパスで、単一のコンパクションタスクが選択する合計データ量 (MB) です。 |
|
|
30 |
ファイル内の削除済み行の割合がこの値 (%) を超えると、領域を回収するためにファイルをその場でコンパクションします。 |
|
|
false |
ファイル選択時にレベル境界を無視し、レベルをまたいだマージを許可します。各レベルに数個ずつ存在し、トリガーしきい値に到達せずにマージされないロングテールの小さなファイルを解消するために使用します。 |
|
|
true |
最下位レベルのファイルをコンパクション対象に含めるかどうかを指定します。 |
ワーカーレベルのコンパクション総同時実行数 (単一のワーカーノード上のすべてのテーブルで共有される上限) は、テーブルプロパティではなくインスタンスレベルの設定であり、SET_TABLE_PROPERTY では変更できません。調整が必要な場合はテクニカルサポートにお問い合わせください。
例
例 2 と例 3 では高度なプロパティを変更します。テクニカルサポートのガイダンスのもとで実行し、問題が解決したらデフォルトに戻してください。
例 1:バルクロードのためにコンパクションを一時停止
-- 1. 現在の状態を記録します。結果が空の場合、上書きは設定されていません。
SELECT property_key, property_value FROM hologres.hg_table_properties
WHERE table_namespace = 'public' AND table_name = 'orders'
AND property_key = 'online_config_compaction_semaphore';
-- 2. 新規コンパクションタスクのスケジューリングを停止します。
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', '0');
-- 3. バルクロードを実行します。実行中は CPU、I/O、ロードスループットを監視します。
-- 4. プロパティを復元します。手順 1 の結果に応じて、次のいずれかを選択します:
-- 4a. 手順 1 が行を返さなかった場合:
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', 'reset');
-- 4b. 手順 1 が値を返した場合。その値を書き戻します:
-- CALL SET_TABLE_PROPERTY('public.orders', 'online_config_compaction_semaphore', '<original_value>');
-- 5. バックログをマージします。書き込みが少ない時間帯に実行します。
VACUUM public.orders;
例 2:ロングテールの小さなファイルを解消
各レベルのファイル数がトリガーしきい値未満であるにもかかわらず、マージされない小さなファイルが数十個蓄積している場合に使用します。
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_ignore_level_compaction', 'true');
VACUUM public.orders;
-- ファイル数が減少したらデフォルトに戻します。有効のままにすると、継続的に書き込まれるテーブルで
-- コンパクション頻度が増加し、CPU と I/O 使用量が増大します。
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_ignore_level_compaction', 'reset');
例 3:より大きなマージ済みファイルを生成
タブレットが多数のファイルに分散した大きなデータ量を保持している場合に使用します。
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_orc_max_total_size_to_merge_mb', '512');
VACUUM public.orders;
-- ファイル数が減少したらデフォルトに戻します。
CALL SET_TABLE_PROPERTY('public.orders', 'online_config_orc_max_total_size_to_merge_mb', 'reset');
Hologres では、VACUUM <table_name> はテーブルをフラッシュし、そのコンパクションタスクが収束するまで待機します。これは自動コンパクションをトリガーする方法です。たとえば、online_config_compaction_semaphore を 0 から引き上げた後や、選択プロパティを変更した後に有用です。ただし、フルコンパクションと同等ではなく、すべてのファイルをレベルをまたいで強制的にマージするものでもありません。
変更が反映されたことの確認
-
プロパティ名は検証されません。
online_config_プレフィックスの後に続く任意の名前が受け付けられ、ステートメントは成功します。名前を誤記するとどの設定にも一致しないため、変更は何も起こらずに黙って無効になります。これを防ぐには次を実施してください:-
このトピックの表からプロパティ名をコピーし、手入力しないでください。
-
hologres.hg_table_propertiesをクエリして書き込みを確認してください。 -
ファイル数とファイルサイズを監視して、動作が実際に変わったことを確認してください。ステートメントが成功しただけでは、何も証明できません。
-
-
パーティションテーブルがプロパティを継承するのは作成時のみです。
SET_TABLE_PROPERTYを実行しても、既存の子パーティションには影響しません。プロパティは親にのみ書き込まれますが、親はデータを保持しないため、既存パーティションのコンパクション動作は変わりません。子パーティションは作成時に 1 回だけ親のプロパティをコピーします。これには動的パーティショニングによって自動作成されるパーティションも含まれます。その後の親への変更は伝播されません。パーティションテーブルでコンパクション動作を変更するには、対象の各子パーティションに対してSET_TABLE_PROPERTYを実行し、それぞれ検証してください。将来作成されるパーティションにも継承させたい場合は、親にもプロパティを設定してください。 -
観測による検証 現在のファイル数とファイルサイズについては
hologres.hg_table_file_statusを、論理パーティションテーブルのパーティション別ビューについてはhologres.hg_partition_file_statusを、傾向については (1 日 1 回生成される)hologres.hg_table_infoをクエリしてください。調整が成功すると、総ファイル数が減少し、平均ファイルサイズが増加します。マージで不要になったファイルのクリーンアップ待ちの間、ストレージ使用量が一時的に増える場合がありますが、これは想定どおりです。SELECT * FROM hologres.hg_table_file_status('<schema_name>.<table_name>'::regclass);
リモートコンパクション
Hologres V5.0 以降では、コンパクションタスクのマージフェーズを別の仮想ウェアハウスにオフロードできます。コンパクションがプライマリ仮想ウェアハウスのコンピューティングリソースと競合しなくなるため、オンラインのクエリおよび書き込みパフォーマンスを安定して維持できます。この機能はコンパクションオフロードとも呼ばれます。
前提条件と制限事項
-
リモートコンパクションには Hologres V5.0 以降が必要です。
-
行指向テーブル、列指向テーブル、ハイブリッド行列表テーブルはいずれもリモートコンパクションをサポートしています。ただし、一部の内部コンパクション戦略はオフロードできず、それらのタスクはローカルで実行されます。
-
リモートコンパクションの対象はファイルマージフェーズのみです。データの読み取りと書き込みは引き続きプライマリ仮想ウェアハウスで実行されます。
-
デフォルトでは、リモートコンパクションタスクが失敗してもローカル実行にはフォールバックしません。タスクは直接失敗し、バックグラウンドスケジューラが自動的に再試行します。フォールバック動作を復元するには、グローバルパラメータ
enable_compaction_offload_fallbackをtrueに設定してください。
compaction_resource の設定
compaction_resource テーブルプロパティは、単一テーブルのコンパクションタスクを実行する仮想ウェアハウスを設定します。変更は直ちに反映され、インスタンスの再起動は不要です。
構文
-- テーブルのコンパクションを特定の仮想ウェアハウスにオフロード
CALL SET_TABLE_PROPERTY('<SCHEMA_NAME>.<TABLE_NAME>', 'compaction_resource', '<WAREHOUSE_NAME>');
-- コンパクションを再びローカル仮想ウェアハウスで実行 (デフォルト)
CALL SET_TABLE_PROPERTY('<SCHEMA_NAME>.<TABLE_NAME>', 'compaction_resource', 'local');
例
-- public.orders のコンパクションを readonly という名前の仮想ウェアハウスにオフロード
CALL SET_TABLE_PROPERTY('public.orders', 'compaction_resource', 'readonly');
-- 現在の設定を照会
SELECT property_key, property_value
FROM hologres.hg_table_properties
WHERE table_namespace = 'public'
AND table_name = 'orders'
AND property_key = 'compaction_resource';
結果が空、または local の場合、そのテーブルはローカルでコンパクションを実行していることを意味します。
コンパクションステータスの確認
hologres.hg_show_compactions() を呼び出して、リモートで実行されたものを含む、実行中および完了済みのコンパクションタスクを一覧表示します。
hologres.hg_show_compactions() が返すレコードはメモリ上に保持されます。インスタンスの再起動時にクリアされます。レコードはタスク終了時刻に基づいて保持されます。終端状態に達したレコードは、デフォルトで 600 秒 (10 分) 保持されます。
-- すべてのコンパクションレコードを一覧表示
SELECT * FROM hologres.hg_show_compactions();
-- リモートで実行されたコンパクションレコードを一覧表示
SELECT table_name, status, compaction_reason, execution_location,
warehouse_name, start_time, end_time, extended_cost, last_error
FROM hologres.hg_show_compactions()
WHERE execution_location = 'warehouse'
ORDER BY start_time DESC;
この関数は次のフィールドを返します。
|
フィールド |
説明 |
|
|
データベース名。現在のデータベースのレコードのみが返されます。 |
|
|
スキーマ名。 |
|
|
テーブル名。 |
|
|
テーブル ID。 |
|
|
データシャードの ID。 |
|
|
コンパクションタスクの識別子。 |
|
|
タスクステータス。有効な値: |
|
|
タスクをトリガーした理由。たとえば、手動でトリガーしたフルコンパクションは |
|
|
適用されている |
|
|
実際にタスクが実行された場所。 |
|
|
タスクをリモート実行した仮想ウェアハウス名。ローカル実行の場合は空です。 |
|
|
タスクがスケジューリングキューに入った時刻。 |
|
|
タスクが終端状態に達した時刻。タスク実行中は空です。 |
|
|
進捗。予約フィールドであり、現時点では常に |
|
|
各フェーズで消費した時間 (JSON 形式)。 |
|
|
入力および出力統計 (JSON 形式)。 |
|
|
タスクが失敗した場合のエラーメッセージ。成功時は空です。 |
例
次の例では、テーブルのコンパクションをリモート仮想ウェアハウスにオフロードし、その後フルコンパクションを手動でトリガーします。
-- 1. ターゲットの仮想ウェアハウスが存在することを確認します。Hologres の
-- コンソールまたは API で作成します。この例では readonly という名前のものを使用します。
-- 2. テーブルがリモートコンパクションを使用するように設定します。
CALL SET_TABLE_PROPERTY('public.lineitem', 'compaction_resource', 'readonly');
-- 3. フルコンパクションをトリガーします。マージフェーズは readonly 仮想ウェアハウスで実行されます。
SELECT hologres.hg_full_compact_table('public.lineitem');
-- 4. コンパクションが完了するまで待機します。
SELECT hologres.hg_wait_table_full_compact('public.lineitem');
-- 5. リモートコンパクションのレコードを確認します。
SELECT table_name, status, compaction_reason, execution_location,
warehouse_name, start_time, end_time, extended_cost,
extended_stats, last_error
FROM hologres.hg_show_compactions()
WHERE table_name = 'lineitem'
AND execution_location = 'warehouse'
ORDER BY start_time DESC;