Liquid Table は、Hologres V4.2.0 で導入されたテーブルストレージモードです。これにより、テーブル作成後にテーブルグループ (したがってシャード数) を、テーブルの再構築、ダウンタイム、手動でのデータ移行なしでオンラインで変更できます。
概要
Liquid Table とは
Liquid Table は、Hologres の新しいテーブルストレージモードです。その決定的な機能は次のとおりです:
テーブルの再構築、サービス中断、手動でのデータ移行を伴うことなく、作成後にテーブルを別のテーブルグループ (つまり、そのシャード数) にオンラインで動的に再割り当てできます。
これにより、従来のデータウェアハウスにおいて「データ増加後にシャードの粒度を調整するには法外なコストがかかる」という長年の問題点に対処します。
|
問題点 (従来モード) |
Liquid Table による解決策 |
|
初期シャード数の見積もりを誤ると、テーブル全体の再構築が必要 |
|
|
データが倍増してもクエリ同時実行数が上限に達し、移行が強制される |
オンラインでシャードをスケールアウト。データはバックグラウンドで自動的に再分散される |
|
スケールインには、リソースを解放するためのテーブルの再構築が必要 |
オンラインでスケールイン。バックグラウンドコンパクションにより、データがより少ないシャードに統合される |
|
スケーリング操作中のサービス中断 |
読み取りと書き込みは全体を通して継続 (書き込みレイテンシーは一時的に急上昇する可能性がありますが、読み取りレイテンシーは影響を受けません) |
主な機能
-
オンラインリシャーディング:
ALTER TABLEを使用して、アプリケーションに対して透過的に、いつでもシャード数を変更できます。 -
複数のストレージ形式: 列指向 (
column)、行指向 (row)、およびハイブリッド (row,column) をサポートします。 -
制御されたデータ再分散: バックグラウンドでの自動的なデータ再分散か、より高速なメタデータの切り替えのために再分散をスキップするかを選択できます。
-
パーティションウィンドウ制御: データ再分散を直近 N 日/月 のパーティションに限定し、I/O オーバーヘッドを削減します。
-
幅広い機能互換性: Dynamic Table、GSI、フルテキストインデックス、ベクターインデックス (HGraph)、タイムトラベル (MVCC)、Binlog、および論理パーティションテーブルと連携します。
典型的なユースケース
-
データ増加が初期のシャード見積もりを上回る: 16 シャードで開始し、6ヶ月後に 64 シャードにスケールします。
-
トラフィックイベントのための一時的なスケールアウト: セールイベントの前にシャードを追加してクエリ同時実行数を高め、イベント後にスケールインしてリソースを解放します。
-
ホット/コールドパーティション管理: ホットパーティションをスケールアウトしたまま、コールドな履歴パーティションをスケールインします。
-
エラスティックスケーリングによる AI ベクトル検索: リコールボリュームの増加に応じてベクターテーブルを動的にスケールします。インデックスは全体を通して利用可能なままです。
前提条件
Hologres インスタンスのバージョンは、V4.2.0 以降である必要があります。インスタンスのバージョンを確認するには、SQL ステートメントの一覧をご参照ください。
クイックスタート
Liquid Table の作成
CREATE TABLE ステートメントに WITH (liquid_table = 'true') を追加します:
-- カラムナストレージ (デフォルト、OLAP ワークロード向け)
CREATE TABLE my_table (
id INT NOT NULL,
name TEXT,
ts TIMESTAMPTZ,
PRIMARY KEY(id)
) WITH (liquid_table = 'true');
-- 行指向ストレージ (ポイントルックアップ/高頻度の更新向け)
CREATE TABLE my_row_table (
id INT NOT NULL,
name TEXT,
PRIMARY KEY(id)
) WITH (liquid_table = 'true', orientation = 'row');
-- ハイブリッドストレージ (ポイントルックアップと OLAP の混合ワークロード向け)
CREATE TABLE my_hybrid_table (
id INT NOT NULL,
name TEXT,
PRIMARY KEY(id)
) WITH (liquid_table = 'true', orientation = 'row,column');
シャード数の変更 (リシャーディング)
リシャーディングは、テーブルを別のテーブルグループに再割り当てして行います:
-- ターゲットのテーブルグループが存在しない場合は作成します
CALL hg_create_table_group('tg_64', 64);
-- スケールアウト (同期的に有効になります)
ALTER TABLE my_table SET (table_group = 'tg_64');
-- スケールイン
ALTER TABLE my_table SET (table_group = 'tg_16');
ALTER コマンドは、メタデータの切り替えが完了するとすぐに返されます。新しい書き込みとクエリはすぐに新しいシャードレイアウトを使用します。既存のデータはバックグラウンドで非同期に再分散されます。
現在のシャード設定の確認
-- テーブルのテーブルグループとシャード数を確認します
SELECT property_key, property_value
FROM hologres.hg_table_properties
WHERE table_name = 'my_table'
AND property_key = 'table_group';
-- テーブルグループのメタデータを確認します
SELECT * FROM hologres.hg_table_group_properties
WHERE tablegroup_name = 'tg_64';
テーブルプロパティリファレンス
作成時のプロパティ
|
プロパティ |
型 |
デフォルト |
説明 |
|
liquid_table |
BOOLEAN |
false |
Liquid Table モードを有効にします。テーブル作成時に指定する必要があります。ALTER TABLE で後から有効化することはできません。 |
|
orientation |
STRING |
column |
ストレージフォーマット: |
|
liquid_table_enable_data_reorganization |
BOOLEAN |
true |
リシャーディング後に、既存データをバックグラウンドで自動的に再分散するかどうかを指定します。 |
|
liquid_table_reorganization_partition_window |
STRING |
すべてのパーティション |
再分散の対象を、指定した時間ウィンドウ内のパーティションに制限します (例: |
liquid_table_enable_data_reorganization の値の選択
|
値 |
動作 |
推奨シナリオ |
|
true (デフォルト) |
リシャーディング後にバックグラウンド再分散が実行され、完了するまで I/O オーバーヘッドが発生します。 |
安定したクエリパフォーマンスが重要な、長期間運用するアクティブテーブル。 |
|
false |
バックグラウンド再分散は実行されません。古いデータに対するクエリパフォーマンスが低下する可能性があります。 |
アーカイブまたは TRUNCATE を予定しているテーブル。軽微な性能低下を許容できる一時的な用途。 |
false モードのパフォーマンスに関する注記:Hologres は、性能低下を緩和するために、内部で最大 8 倍のオーバーシャーディングを使用します。一般的な 2~4 倍のスケーリングシナリオでは、影響はほぼゼロです。ただし、スケーリングファクターがオーバーシャーディングの上限 (例:16 倍以上) を大幅に超える場合、古いデータに対するクエリパフォーマンスは比例して低下する可能性があります。
パーティションウィンドウの例
-- 直近 30 日分のパーティションのみを再分散します (単一の時間型パーティションキーが必要です)
ALTER TABLE order_log SET (
table_group = 'tg_64',
liquid_table_reorganization_partition_window = '30 day'
);
これは、履歴のコールドパーティションにほとんどアクセスしない長期保持のログテーブルやファクトテーブルに最適です。再分散が必要なのはホットパーティションのみです。
機能の互換性
互換性マトリクス (V4.2.0)
|
機能の組み合わせ |
サポート |
備考 |
|
Liquid Table としての動的テーブル |
はい |
リシャーディング後、動的テーブルは 1 回のフルリビルド (更新レイテンシーが長くなります) を実行した後、増分計算を再開します。 |
|
動的テーブルのソーステーブルとしての Liquid Table |
はい |
リシャーディング後、動的テーブルは 1 回のフルリビルド (更新レイテンシーが長くなります) を実行した後、増分計算を再開します。 |
|
グローバルセカンダリインデックス (GSI) |
はい |
GSI を持つテーブルは、V4.2 でリシャーディングできます。 |
|
全文転置インデックス |
はい |
リシャーディング後もインデックスは使用できます。 |
|
ベクターインデックス (HGraph) |
はい |
インデックスは使用可能なままで、近似検索結果も安定します。 |
|
論理パーティションテーブル |
はい |
リシャーディングをサポートします。自動パーティション分割は通常どおり動作します。 |
|
タイムトラベル (MVCC) |
はい |
リシャーディング後も履歴データをクエリできます。 |
|
バイナリログ |
実験的な GUC が必要 |
実験的な GUC が必要で、ダウンストリームのコンシューマーには固有の要件があります。 |
|
物理パーティションテーブル |
いいえ |
代わりに論理パーティションテーブルを使用してください。 |
|
マテリアライズドビュー (MV) |
いいえ |
|
|
ALTER による既存テーブルの Liquid Table への変換 |
いいえ |
再構築による移行アプローチを使用する必要があります。 |
|
MaxCompute による Liquid Table のダイレクトリード |
いいえ |
まだサポートされていません。 |
インデックス共存の例
-- フルテキストインデックス
CREATE INDEX ft_idx ON my_table USING FULLTEXT (content)
WITH (tokenizer = 'jieba');
-- GSI (グローバルセカンダリインデックス)
CREATE GLOBAL INDEX gsi_name ON my_table(name) INCLUDE (ts);
-- ベクターインデックス (vectors プロパティ経由)
ALTER TABLE my_table SET (vectors = '{
"embedding": {
"algorithm": "HGraph",
"distance_method": "Cosine"
}
}');
Liquid Table にインデックスを作成した後、ALTER TABLE ... SET (table_group = '...') を使用して直接リシャーディングを実行できます。すべてのインデックスは、新しいシャードで自動的に使用可能な状態のままになります。
ワークロードに対するリシャーディングの影響
この章は、データウェアハウスの開発者および DBA が ALTER TABLE ... SET (table_group = ...) を実行する前に 必ずお読みいただく 必要があります。
リシャーディングは、内部的に次の 2 つのフェーズで構成されます。
-
メタデータの切り替え (同期):
ALTER TABLEコマンド自体を指します。数秒で完了し、コマンドが返された時点で新しいシャードトポロジーが有効になります。 -
データ再配布 (非同期バックグラウンド):既存のデータを古いシャードから新しいシャードへ移行・コンパクションします。所要時間はデータ量、スケーリングファクター、利用可能な I/O に依存します。
プロセス全体を通して、読み取りと書き込みは失敗やブロックなしで継続する見込みです。ただし、書き込みレイテンシーと古いデータに対するクエリパフォーマンスには、観測可能な影響が出ます。影響が出ることを前提に、メンテナンスウィンドウとロールバック戦略を計画してください。影響がゼロであると想定しないでください。
影響の概要
|
観点 |
メタデータの切り替えフェーズ (秒) |
データ再配布フェーズ (非同期バックグラウンド) |
|
サービス可用性 |
中断は想定されていません |
中断は想定されていません |
|
リクエスト失敗 |
失敗は想定されていません (エッジケースでは少数の一時的なエラーが発生する可能性があります。クライアントリトライで対応してください) |
失敗は想定されていません |
|
書き込みレイテンシー |
観測可能なスパイクが発生します。通常はミリ秒~秒単位ですが、場合によってはさらに長くなる可能性があります |
バックグラウンドの I/O 競合により、わずかに増加する可能性があります |
|
書き込みスループット |
切り替えの前後で観測可能な低下が発生します |
インスタンスの I/O ヘッドルームに大きく依存し、スロットリングされる可能性があります |
|
新しいデータに対するクエリパフォーマンス |
ほとんど影響しません |
ほとんど影響しません (すでに新しいシャードに書き込まれているため) |
|
古いデータに対するクエリパフォーマンス |
直ちに低下する可能性があります |
再配布が完了するまで低下が続く可能性があります。低下が大きくなる場合もありますが、一般的なスケーリングシナリオ (例: 2 倍) では、内部最適化によって影響を緩和できます。 |
|
インデックス可用性 |
引き続き利用可能です |
引き続き利用可能です (基盤となる I/O 競合によりパフォーマンスに影響する可能性があります) |
|
トランザクション整合性 |
保証されます |
保証されます |
上表の「中断は想定されていません」および「失敗は想定されていません」は、一般的な条件下での動作を示すものであり、絶対的な保証ではありません。実際の動作は、インスタンス仕様、データ量、同時負荷、スケーリングファクターに依存します。本番環境でリシャーディングを実行する前に、テスト環境でリハーサルを行うことを強く推奨します。
書き込みへの影響
1) 書き込みは失敗しない見込みですが、クライアントリトライを設定してください。メタデータの切り替え中、少数の同時リクエストで一時的なエラー (例: 接続タイムアウト) が発生する可能性があります。コネクタでは自動リトライを有効にしてください。長時間の書き込み不可は発生しません。
2) 書き込みレイテンシーは観測可能なスパイクが発生します。これは「影響ゼロ」ではありません。処理中の書き込みは、新しいトポロジーが有効になるまで待機する必要があります。スパイクは通常ミリ秒~秒の範囲ですが、次の場合にはより長くなることがあります。
-
テーブル上で長時間実行されるトランザクションが存在する場合。
-
インスタンスの I/O 使用率がすでに高い場合。
-
スケーリングファクターが非常に大きい場合 (例: 8 シャードから 128 シャードへ直接スケールアウトする)。
3) 再配布フェーズ中、書き込みはブロックされませんが、レイテンシーがわずかに増加する可能性があります。
-
バックグラウンドのデータ移行がインスタンスの I/O を消費し、フォアグラウンドの書き込みとリソースを競合する可能性があります。
-
I/O 使用率が高いインスタンスでは、再配布中の書き込みレイテンシーが定常状態よりわずかに高くなる可能性があり、スループットもわずかに低下する可能性があります。
-
再配布フェーズ中は、インスタンスの I/O と書き込み RT メトリクスを継続的に監視することを推奨します。
4) COPY / バルクインポートのワークロード:リシャーディングと再配布が完全に完了してから、バルクインポートを開始してください。リシャーディング中に大量のインポートを行うと、再配布時間が大幅に延び、書き込みレイテンシーの変動も増幅します。
クエリへの影響
1) クエリは失敗せず、ブロックもされない見込みです。
-
メタデータの切り替え中、新しいクエリは新しいトポロジーに対して実行されます。
-
処理中のクエリは通常どおり完了します。
-
まれに、切り替えの瞬間に発行されたクエリが、ルートの再ルーティングによりタイムアウトする可能性があります。クライアントのリトライで対処してください。
2) 切り替えの瞬間における読み取りレイテンシーへの影響は通常は最小限ですが、ゼロではありません。
-
書き込みと比べると、読み取りパスは切り替えの影響を受けにくくなります。
-
切り替えのタイミングと重なったクエリでは、ルートの再ルーティングが発生します。レイテンシーに敏感なリアルタイム API では、ミリ秒レベルのジッターが観測される可能性があります。
-
高 QPS のポイントクエリシナリオでは、短時間のジッターが発生することを前提に、上流のタイムアウト設定を計画してください。
3) 古いデータに対するクエリパフォーマンスは、再配布が完了するまで大幅に低下する可能性があります。
|
シナリオ |
古いデータに対するクエリパフォーマンスへの影響 |
|
2 のべき乗のシャード数で 2 のべき乗のスケールアウト (32 → 64) |
内部オーバーシャーディング最適化により、低下は最小限です |
|
2 のべき乗のスケールアウトだが、シャード数が 2 のべき乗ではない (20 → 40) |
内部オーバーシャーディング最適化は適用されますが、シャード数が 2 のべき乗の場合よりパフォーマンス低下が大きくなります |
|
2 のべき乗ではない、または整数倍ではないスケールアウト |
中程度の低下で、一般的に 2 倍を超えません |
|
非常に大きいスケールアウト (元のシャード数から 16 倍以上) |
scaling_factor / 8 に比例して低下します。最悪の場合、再配布が完了するまでクエリは事実上使用できなくなります |
|
整数倍のスケールイン (32 → 16) |
クエリ並列度が低下し、軽度~中程度のパフォーマンス低下が発生します |
|
整数倍ではないスケールイン、またはシャード数が 2 のべき乗ではない |
中程度の低下で、一般的に 2 倍を超えません |
内部オーバーシャーディング最適化:Hologres はデフォルトで、データに対して 非同期に 8 倍のオーバーシャーディングをバックグラウンドで適用します。シャード数が 2 のべき乗の場合、次の表は、各スケーリングファクターにおいて完全にオーバーシャーディングされたデータに対して想定されるクエリパフォーマンスの低下を示します。
|
スケーリングファクター (k) |
パフォーマンス低下 |
|
50% のスケールイン (0.5x) |
0% |
|
1x |
0% |
|
1.5x (50% のスケールアウト) |
12.5% |
|
2x |
0% |
|
2.5x |
15% |
|
3x |
25% |
|
4x |
0% |
|
5x |
40% |
|
6x |
50% |
|
7x |
60% |
|
8x |
0% |
多くの場合、データには完全にオーバーシャーディングが適用されているため、一般的なスケーリングシナリオ (2x、4x) ではパフォーマンス低下はほぼゼロになります。ただし、オーバーシャーディングは緩和策であり、保証ではありません。
-
シャード数が 2 のべき乗でない場合、一般的なスケーリングシナリオでも一定のパフォーマンス低下が発生します。
-
スケーリングファクターがオーバーシャーディング容量 (例: 8x 超) を超えると、オーバーシャーディングではパフォーマンス低下を効果的に防げなくなります。
-
シャードあたりのデータ量が少なすぎる場合、オーバーシャーディング最適化が適用されないことがあります。
-
書き込み負荷が高い場合、新規に書き込まれたデータの相当部分に、まだオーバーシャーディングが適用されていない可能性があります。
-
データ分布やシャードキーの選定が最適でない場合、パフォーマンス低下が大きくなる可能性があります。
-
オーバーシャーディングを、パフォーマンス低下ゼロの保証として扱わないでください。
4) 新しく書き込まれたデータに対するクエリは、ほとんど影響しません。
-
新しいデータは新しいシャードトポロジーに書き込まれるため、クエリパフォーマンスは定常状態と一致します。
-
ただし、クエリが新旧両方のデータにまたがる場合 (例: 時間範囲スキャン)、全体の RT は古いデータ側のパフォーマンス低下に影響されます。
5) インデックスクエリ (GSI、フルテキスト、ベクター) は引き続き機能しますが、安定したパフォーマンスは期待できない場合があります。リシャーディング後もインデックスは利用できますが、インデックスルックアップの物理 I/O がバックグラウンドの再配布と競合し、再配布が完了するまで応答時間が増加する可能性があります。P99 とロングテールクエリを注意深く監視してください。
レイテンシーに敏感なワークロードに対する推奨事項
お使いのワークロードが次のいずれかに該当する場合は、リシャーディングをリスクの高い変更として扱い、変更管理プロセスに従ってください。
|
ワークロードの種類 |
推奨される緩和策 |
|
リアルタイムダッシュボード、アドホック BI クエリ |
オフピーク時間帯に実行してください。2 のべき乗のスケーリングを優先してください。メンテナンスウィンドウについて関係者と調整してください。 |
|
オンラインポイントルックアップ (CRM、リスク管理、アカウント API) |
行指向テーブルはリシャーディングの影響が小さいため、このユースケースでは優先してください。クライアントのタイムアウトを延長し、パフォーマンス劣化時の戦略 (レート制限、キャッシュフォールバック) を準備してください。 |
|
Flink のリアルタイム書き込み |
コネクタのリトライとバックプレッシャーのパラメータを増やしてください。ソース側の遅延を監視してください。メンテナンスウィンドウ中の上流バッファリングを計画してください。 |
|
バイナリログのコンシューマー |
本ドキュメントのバイナリログ固有の手順に従ってください。すべてのダウンストリームコンシューマーに対して、ステートレス再起動を行うよう通知してください。コンシューマーが追いつくための時間を確保してください。 |
|
高頻度 UPSERT ジョブ |
必ずオフピーク時間帯に実行してください。2 のべき乗のスケーリングファクターを優先してください。 |
|
SLA が重要な OLAP レポート |
実行前に、想定されるクエリパフォーマンス低下を評価してください。必要に応じて、複数回の小さなスケーリング手順に分割することを検討してください。 |
影響期間の目安(保守的)
|
フェーズ |
保守的な所要時間の目安 |
影響範囲 |
|
メタデータの切り替え |
秒単位。長時間トランザクションの待機により、分単位になる可能性があります |
観測可能な書き込みレイテンシーのスパイク。一部のリクエストでリトライが必要になる可能性があります |
|
再配布 (小規模テーブル < 100 GB) |
数十分 |
古いデータに対するクエリパフォーマンスの低下が継続します。書き込みは I/O 競合の影響を受ける可能性があります |
|
再配布 (中規模テーブル 100 GB ~ 1 TB) |
数時間~半日 |
古いデータに対するクエリパフォーマンスの低下が継続します。オフピーク時間帯にスケジュールしてください |
|
再配布 (大規模テーブル > 1 TB) |
1日以上。複数日になる可能性があります |
古いデータに対するクエリパフォーマンスの低下が長期化します。 |
結論
リシャーディングでは、サービスは稼働し続け、リクエストも成功しますが、観測可能な影響を前提に計画してください。 書き込みレイテンシーはスパイクします (ミリ秒~秒、エッジケースではさらに長くなる可能性があります)。古いデータに対するクエリパフォーマンスは、再配布が完了するまで低下します。低下の程度は、スケーリングファクターと、それが 2 のべき乗の倍数であるかどうかに相関します。最悪の場合、パフォーマンス低下が長期間継続する可能性があります。一般的なシナリオ (例: 2 倍のスケーリング) では、内部オーバーシャーディング最適化により影響を緩和できます。
Binlog に特有の考慮事項 (重要)
Liquid Table で Binlog が有効になっている場合 (binlog_level = 'replica')、リシャーディングの動作は通常のテーブルとは異なります。続行する前に、このセクション全体をお読みください。
デフォルトの動作
Binlog が有効になっている Liquid Table は、デフォルトではリシャーディングが許可されていません。ALTER TABLE ... SET (table_group = ...) を直接実行すると、エラーが返されます。
強制リシャーディングプロシージャ
-- ステップ 1: 実験的な GUC を有効にします (セッションレベルのみ)
SET hg_experimental_enable_liquid_resharding_for_table_with_binlog = on;
-- ステップ 2: リシャーディングを実行します
ALTER TABLE my_binlog_table SET (table_group = 'tg_64');
-- ステップ 3: 古いシャード上のデルタデータをクリーンアップします
CALL hg_liquid_resharding_drop_non_current_delta('my_binlog_table');
Binlog コンシューマーへの影響
|
イベント |
説明 |
|
リシャーディング中 |
Binlog コンシューマー (コネクタ) はエラーを検出し、フェールオーバーをトリガーします。ただし、オフセットが無効になり、ジョブは使用できなくなります。 |
|
スケールアウト後 (シャード数が増加) |
フェールオーバーは成功する可能性が高いですが、状態は信頼できません。ステートレスな再起動が必要です。 |
|
スケールイン後 (シャード数が減少) |
フェールオーバーは常に失敗します。 |
|
リシャーディング完了後 |
すべてのコンシューマーは、ステートレスな再起動 (オフセットをリセットして最初から再消費) を実行する必要があります。 |
|
SQL ベースの Binlog クエリ |
最新のリシャーディング後に生成された Binlog エントリのみが表示されます。履歴エントリは失われます。 |
DBA チェックリスト:1) すべての Binlog ダウンストリームコンシューマー (Flink / コネクタ / カスタムサブスクライバー) に通知してください。2) メンテナンスウィンドウ中:コンシューマーを一時停止する → リシャーディングを実行する → クリーンアッププロシージャを呼び出す → すべてのコンシューマーをステートレスに再起動する。3) ダウンストリームコンシューマーと調整せずに、Binlog が有効な Liquid Table をリシャーディングしないでください。
既存テーブルの Liquid Table への移行
既存のテーブルは、ALTER を使用して Liquid Table に変換することはできません。次の 2 つのアプローチのいずれかを使用してください。
アプローチ 1: REBUILD による変換 (推奨)
Hologres V4.2 以降では、ASYNC REBUILD TABLE を使用して、既存のテーブルをその場で Liquid Table に再構築できます。新しいテーブルの作成や手動でのデータ移行が不要で、テーブル名も変更されません。REBUILD の詳細については、「REBUILD」をご参照ください。
-- 既存のテーブルをその場で Liquid Table に変換します (テーブル名は変更されません)
ASYNC REBUILD TABLE my_table
SET (
liquid_table = 'true'
);
アプローチ 2:新しいテーブルへの移行
新しい Liquid Table を作成し、既存のテーブルからデータを移行し、アトミックなトランザクションリネームを使用して切り替えます。
-- 1. 同じスキーマで新しい Liquid Table を作成します
CREATE TABLE my_table_new (
id INT NOT NULL,
name TEXT,
ts TIMESTAMPTZ,
PRIMARY KEY(id)
) WITH (liquid_table = 'true');
-- 2. データをコピーします
INSERT INTO my_table_new SELECT * FROM my_table_old;
-- 3. インデックスを再作成します (存在する場合)
CREATE INDEX ... ON my_table_new ...;
-- 4. トランザクションを使用してアトミックにスワップします
BEGIN;
ALTER TABLE my_table_old RENAME TO my_table_bak;
ALTER TABLE my_table_new RENAME TO my_table;
COMMIT;
-- 5. 検証後にバックアップを削除します
DROP TABLE my_table_bak;
制限
-
Hologres V4.2.0 以降が必要です。それより前のバージョンを実行している場合は、まずインスタンスをアップグレードしてください。
-
liquid_tableプロパティは、テーブル作成時にのみ設定できます。既存の通常テーブルをALTER TABLEで Liquid Table に変換することはできません。代わりに再構築による移行アプローチを使用してください。 -
物理パーティションテーブルはサポートされていません。Liquid Table で物理パーティション構文を使用しようとすると、
Physical partitioned table of liquid table is not supportedというエラーが返されます。代わりに論理パーティションテーブルを使用してください。 -
Liquid Table にマテリアライズドビューを作成することはできません。代わりに動的テーブルを使用してください。
-
MaxCompute による Liquid Table の直接読み取りは、まだサポートされていません。ダウンストリームが MaxCompute の直接読み取りに依存している場合、現在のバージョンでは Liquid Table は使用できません。
-
Liquid Table を含むインスタンスは、この機能をサポートしていないバージョンにダウングレードすることはできません。Liquid Table を作成する前に、インスタンスのバージョンをロールバックする必要がないことを確認してください。
-
リシャーディング (テーブルグループの変更) 中、書き込みレイテンシーが明らかにスパイクし (ミリ秒から秒単位、エッジケースではより長くなる可能性があります)、古いデータのクエリパフォーマンスが大幅に低下する可能性があります。
-
ALTER TABLE ... SET (table_group = ...)は、実行を開始する前に、テーブルで進行中のすべての DML 操作が完了するまで待機する必要があります。長時間実行される DML 操作や未完了のトランザクションは、ALTER コマンドをブロックします。 -
liquid_table_reorganization_partition_windowパラメータは、単一の時刻型パーティションキーでのみ動作します。複数のパーティションキーや時刻型以外のパーティションキーはサポートされていません。 -
Binlog が有効になっている Liquid Table は、デフォルトではリシャーディングできません。実験的な GUC
hg_experimental_enable_liquid_resharding_for_table_with_binlogを有効にし、ダウンストリームの Binlog コンシューマーがステートレスな再起動に対応できることを確認する必要があります。 -
リシャーディング後、SQL ベースの Binlog クエリは、最新のリシャーディング以降に生成されたエントリのみを返します。履歴の Binlog は表示されなくなります。
-
テーブルグループにテーブルがアタッチされている間は、そのテーブルグループを削除できません。
-
リシャーディングは不可逆な操作です。メタデータの切り替えが完了すると、「ロールバック」のショートカットはありません。元に戻すには、ALTER を再度実行して、テーブルを元のテーブルグループに移動する必要があります。
-
現在のバージョンでは、リシャーディングの進行状況をクエリするためのインターフェースは提供されていません。データ再配分の正確な割合をリアルタイムで確認する方法はありません。
ベストプラクティス
Liquid Table を有効化するタイミング
強く推奨:
-
テーブルのライフサイクルを通じて、データ量が 5 倍以上に増加すると見込まれる場合。
-
季節的なトラフィックスパイクやセールイベントがあり、エラスティックシャードスケーリングが必要な場合。
-
リアルタイムデータウェアハウスのコアファクトテーブル、またはワイドテーブル。
-
AI ベクトル検索テーブル。
適用を延期できるケース:
-
データ量が安定している小規模なディメンションテーブル。
-
物理パーティションテーブルに依存するワークロード。
-
MaxCompute の直接読み取りに依存するワークロード。
シャード数の計画に関するガイドライン
|
シャードあたりのデータ量 |
推奨アクション |
|
< 10 GB |
オーバーシャーディングの可能性があります。 |
|
10 GB ~ 50 GB |
正常範囲 |
|
50 GB ~ 100 GB |
クエリパフォーマンスを監視し、 |
|
> 100 GB |
直ちに |
リシャーディング実行時のヒント
-
オフピーク時間に実行:トラフィックが少ないメンテナンスウィンドウ中に
ALTERを実行してください。 -
大規模 DML を静止:バルク
INSERT/UPDATE/DELETEジョブが実行されていないことを確認してください。 -
2 のべき乗の倍数を優先:例:16 → 32 → 64 は、16 → 50 よりもパフォーマンスが安定します。
-
大規模テーブルではパーティションウィンドウを使用:長期間運用するパーティションテーブルでは、
liquid_table_reorganization_partition_windowを設定して再分散の範囲を制限してください。 -
Binlog テーブルをエンドツーエンドでリハーサル:ステージング環境で、リシャーディングとダウンストリームの再起動という一連のフローを事前にテストしてください。
監視に関する推奨事項
-
再分散が完了するまで:古いシャードと新しいシャードのクエリ応答時間を定期的に比較し、進捗を確認してください。
-
インスタンスのリソース使用率:リシャーディングでは追加の I/O オーバーヘッドが発生します。CPU と I/O 使用率を監視してください。
-
Binlog カーソルラグ:Binlog が有効なテーブルでは、
ダウンストリームコンシューマーラグを監視してください。
よくある質問
Q1:Liquid Table と通常のテーブルの根本的な違いは何ですか?
A:Liquid Table は、base + delta ストレージモデルを使用します。これにより、すべてのデータを書き換えることなく、シャードレイアウトを変更できます。通常のテーブルでは、シャード分散は作成時に固定されます。シャードを変更するには、テーブル全体の再構築が必要です。
Q2:リシャーディングによってデータ損失は発生しますか?
A:いいえ。リシャーディングの全期間を通じて、読み取りと書き込みのリクエストはトランザクション整合性を維持します。コミット済みのデータはすべて保持されます。検証テストにより、リシャーディングの前後でデータ整合性が 100% であることを確認しました。
Q3:リシャーディングによってサービス停止時間は発生しますか?
A:リシャーディングの全期間を通じてサービスは利用可能であり、リクエストは失敗しない想定です。ただし、書き込みレイテンシーには観測可能なスパイク (ミリ秒~秒) が発生し、再分散が完了するまで古いデータへのクエリパフォーマンスが低下する可能性があります。詳細については、「ワークロードに対するリシャーディングの影響」セクションをご参照ください。
Q4:リシャーディングにはどのくらい時間がかかりますか?
A:ALTER TABLE コマンド自体は数秒で戻ります (同期的なメタデータの切り替え)。実際のデータ再分散はバックグラウンドで非同期に実行され、所要時間はデータ量とスケーリングファクターに比例します。
Q5:テーブルを複数回リシャーディングできますか?
A:はい。ただし、リシャーディングを実行するたびに、バックグラウンドで新たなデータ再分散がトリガーされます。頻繁な変更を避けるため、目標のシャード数は慎重に計画してください。
Q6:リシャーディングの進捗を監視できますか?
A:現行バージョンでは、専用の進捗 API は提供されていません。バックグラウンドコンパクションのタスクやクエリ応答時間を監視することで、進捗を推定できます。この機能は製品ロードマップに記載されています。
Q7:スケールインするとストレージはすぐに解放されますか?
A:スケールインにより、データは直ちにより少ないシャードへ統合されますが、ストレージ領域が実際に解放されるのは、バックグラウンドコンパクションが完了した後です。
Q8:Liquid Table によって追加のストレージオーバーヘッドは発生しますか?
A:base + delta モデルでは、デルタデータがまだコンパクションされていない間、軽微なオーバーヘッドが発生する可能性があります。これはバックグラウンドコンパクションにより自動的に解消されます。全体として、ストレージ使用量は通常のテーブルと同程度です。
Q9:1 つの Liquid Table で複数のインデックスタイプ (GSI + フルテキスト + ベクター) を共存できますか?
A:はい。V4.2 では、複数のインデックスタイプを持つ Liquid Table のリシャーディングをサポートしています。
Q10:Liquid Table を通常のテーブルに戻せますか?
A:はい。逆方向の再構築により可能です。通常のテーブルを作成し、INSERT INTO ... SELECT を使用してデータを移行した後、RENAME で入れ替えます。なお、インスタンスに Liquid Table が含まれると、この機能をサポートしないバージョンへダウングレードできません。
クイックリファレンス
-- Liquid Table の作成
CREATE TABLE t (...) WITH (liquid_table = 'true');
-- リシャーディング
ALTER TABLE t SET (table_group = 'tg_xxx');
-- バックグラウンドデータ再編成の無効化
ALTER TABLE t SET (liquid_table_enable_data_reorganization = 'false');
-- 直近 30 日間のパーティションのみを再分散
ALTER TABLE t SET (
table_group = 'tg_xxx',
liquid_table_reorganization_partition_window = '30 day'
);
-- Binlog が有効化されたテーブルのリシャーディング (実験的、ダウンストリームの再起動が必要)
SET hg_experimental_enable_liquid_resharding_for_table_with_binlog = on;
ALTER TABLE t SET (table_group = 'tg_xxx');
CALL hg_liquid_resharding_drop_non_current_delta('t');