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

Hologres:ホットデータとコールドデータの階層型ストレージ

最終更新日:Jan 11, 2025

Hologres V1.3.37 以降では、ホットデータとコールドデータの階層型ストレージがサポートされており、お客様は科学的な方法でデータを管理できます。このトピックでは、Hologres でホットデータとコールドデータの階層型ストレージを使用する方法について説明します。

ストレージタイプ

Hologres のデータストレージモードには、標準ストレージと低頻度アクセス(IA)ストレージがあります。

  • 標準ストレージは、ソリッドステートドライブ(SSD)ホットストレージと呼ばれます。これは Hologres が使用するデフォルトのストレージモードであり、このストレージモードは低レイテンシと高パフォーマンスのデータアクセス要件を満たします。標準ストレージは、ほとんどのシナリオで最も効率的で費用対効果の高い選択肢です。

  • IA ストレージは、ハードディスクドライブ(HDD)コールドストレージと呼ばれます。このストレージモードは、IA データの費用対効果の高いストレージ要件を満たします。 IA ストレージは、レイテンシに影響されない、またはアクセス頻度の低い超大規模データセットに最適な選択肢です。

  • プライマリインスタンスとセカンダリインスタンスにデータを保存する場合は、Hologres インスタンスを V1.3.55 以降にアップグレードし、HDD コールドストレージを使用することをお勧めします。

Hologres は、テーブル内のホットデータとコールドデータの階層型ストレージもサポートしています。 Hologres の CREATE PARTITION TABLE ステートメントを使用して、子テーブルのストレージモードを設定できます。

Hologres V2.1 以降では、SSD キャッシュベースのアクセラレーションがサポートされており、コールドストレージ内のデータへのアクセスを高速化できます。現在、デフォルトのキャッシュスペース内のデータへのアクセスのみが高速化されます。キャッシュアクセラレーションはデフォルトで有効になっており、アクセス パフォーマンスは 2 倍以上向上すると予想されます。

前提条件

  • Hologres V1.3.37 以降のみが、ホットデータとコールドデータの階層型ストレージをサポートしています。 Hologres インスタンスのバージョンが V1.3.37 より前の場合は、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、Hologres DingTalk グループに参加してインスタンスのアップグレードを申請してください。 Hologres インスタンスを手動でアップグレードする方法の詳細については、「インスタンスのアップグレード」をご参照ください。 Hologres DingTalk グループへの参加方法の詳細については、「Hologres のオンラインサポートを受ける」をご参照ください。

  • サブスクリプション課金方式を使用するインスタンスの場合、インスタンスを V1.3.37 にアップグレードした後、インスタンスの IA ストレージのデフォルトクォータは 0 GB です。

使用上の注意

  • Hologres テーブルは、ユーザーデータとメタデータで構成されています。ホットデータとコールドデータの階層型ストレージでは、ユーザーデータのストレージモードのみを設定できます。パフォーマンスを確保するために、メタデータはホットストレージ層に保存する必要があります。テーブルのストレージモードがコールドストレージに設定されている場合でも、メタデータはホットストレージ層に保存されます。これにより、少量のホットストレージ料金が発生します。

  • ユーザーサービスへの影響を最小限に抑えるため、ホットデータとコールドデータの移行タスクには低い優先度が設定されています。ユーザーデータのストレージモードを変更した後、設定はすぐに有効になりません。 Hologres は、バックエンドで非同期モードでデータを移行します。デフォルトでは、移行は当日の 00:00 に開始されます。 Hologres V2.2 以降では、移行時間をカスタマイズできます。詳細については、「動的パーティショニング」をご参照ください。

  • テーブルのコールドストレージ層に新しいデータを書き込む場合、Hologres は最初にデータをホットストレージ層に書き込み、次にバックエンドで非同期タスクを使用してデータをコールドストレージ層に移行します。これにより、一定量のホットストレージ料金が発生します。

  • ディスクシーク時間の制限のため、テーブルでポイントクエリが実行される場合は、ストレージモードをコールドストレージに設定しないことをお勧めします。たとえば、Apache Flink 用 Realtime Compute の Hologres ディメンションテーブルやサービングテーブルにコールドストレージを適用しないことをお勧めします。 Hologres がコールドストレージ層から 1 秒あたりに読み取るテーブル行数は、Hologres がホットストレージ層から 1 秒あたりに読み取るテーブル行数よりも 100 倍少なくなります。

  • 行指向テーブルのストレージモードをコールドストレージに設定しないことをお勧めします。

  • コードストレージ層とホットストレージ層の間でデータをバッチで移行する場合、すべてのテーブルの tablets が有効になります。これにより、メモリ使用量が増加します。一度に最大 200 個のテーブルでデータを移行することをお勧めします。 /* これにより、メモリ使用量が増加します。一度に最大 200 個のテーブルでデータを移行することをお勧めします。 */

テーブルのホットデータとコールドデータの階層型ストレージを設定する

テーブルを作成するときに、SET_TABLE_PROPERTY ステートメントの storage_mode パラメータを設定して、テーブルのストレージモードを指定できます。詳細については、「CREATE TABLE」をご参照ください。

非パーティションテーブル

非パーティションテーブルのストレージモードを指定する

SET_TABLE_PROPERTY ステートメントの storage_mode パラメータを設定して、非パーティションテーブルのストレージモードを指定できます。このパラメータの有効な値:

  • hot

  • cold

たとえば、tbl1 という名前のテーブルを作成し、テーブルのストレージモードをコールドストレージに設定できます。ステートメントの例:

-- テーブルを作成するときに、ストレージモードをコールドストレージとして指定します。
/* テーブルを作成するときに、ストレージモードをコールドストレージとして指定します。 */
BEGIN;
CREATE TABLE tbl1 (
 "id" int NOT NULL,
 "name" text NOT NULL
);
CALL set_table_property('tbl1', 'storage_mode', 'cold');
COMMIT;

非パーティションテーブルのストレージモードを変更する

Hologres では、テーブルを作成した後にストレージモードを変更できます。たとえば、tbl1 テーブルのストレージモードをホットストレージに変更できます。システムはデータをホットストレージ層に非同期的に移行します。ステートメントの例:

-- テーブルを作成した後に、ストレージモードをホットストレージに変更します。
/* テーブルを作成した後に、ストレージモードをホットストレージに変更します。 */
CALL set_table_property('tbl1', 'storage_mode', 'hot');

パーティションテーブル

パーティションテーブルのストレージモードを指定する

SET_TABLE_PROPERTY パラメータを指定して、パーティションテーブルのストレージモードを設定できます。子テーブルは、デフォルトで親テーブルのストレージモードを継承します。子テーブルのストレージモードを個別に指定することもできます。有効な値:

  • hot

  • cold

たとえば、tbl2 という名前の親テーブルのストレージモードをコールドストレージに設定できます。親テーブルの tbl2_v1 という名前の子テーブルにデータを書き込むと、データはコールドストレージ層に書き込まれます。ステートメントの例:

-- テーブルを作成するときに、ストレージモードをコールドストレージとして指定します。
/* テーブルを作成するときに、ストレージモードをコールドストレージとして指定します。 */
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_v1 PARTITION OF tbl2 FOR VALUES IN ('v1');
COMMIT;

パーティションテーブルのストレージモードを変更する

Hologres では、テーブルを作成した後にストレージモードを変更できます。たとえば、tbl2 親テーブルのストレージモードをホットストレージに変更できます。システムは、この親テーブルのすべての子テーブルのデータをホットストレージ層に非同期的に移行します。ステートメントの例:

-- テーブルを作成した後に、ストレージモードをホットストレージに変更します。
/* テーブルを作成した後に、ストレージモードをホットストレージに変更します。 */
CALL set_table_property('tbl2', 'storage_mode', 'hot');

たとえば、子テーブルの storage_mode パラメータを cold に設定することで、子テーブルのストレージモードをコールドストレージに変更できます。ステートメントの例:

-- tbl2 親テーブルに tbl2_v2 と tbl2_v3 という名前の子テーブルを作成します。
/* tbl2 親テーブルに tbl2_v2 と tbl2_v3 という名前の子テーブルを作成します。 */

CREATE TABLE tbl2_v2 PARTITION OF tbl2 FOR VALUES IN ('v2');
CREATE TABLE tbl2_v3 PARTITION OF tbl2 FOR VALUES IN ('v3');

-- 子テーブルのストレージモードをクエリします。子テーブルは、デフォルトで親テーブルのストレージモードを継承します。
/* 子テーブルのストレージモードをクエリします。子テーブルは、デフォルトで親テーブルのストレージモードを継承します。 */

SELECT * FROM hg_table_storage_status('public', 'tbl2');

-- tbl2_v3 子テーブルのストレージモードをコールドストレージに変更します。
/* tbl2_v3 子テーブルのストレージモードをコールドストレージに変更します。 */

CALL set_table_property('tbl2_v3', 'storage_mode', 'cold');
                

パーティションテーブルを動的に管理する

動的パーティショニング機能を使用して、ホットストレージ層とコールドストレージ層の間でデータを移行するルールを設定できます。これにより、コストとクエリ パフォーマンスのバランスをとるために、ホットデータとコールドデータの階層型ストレージをインテリジェントな方法で実装できます。動的パーティショニングの詳細については、「動的パーティショニング」をご参照ください。

テーブル内のデータのストレージ状態をクエリする

hg_table_storage_status 関数を呼び出して、テーブル内のデータのストレージ状態をクエリできます。 hg_table_storage_status 関数の戻り値には、メタデータのストレージサイズではなく、ユーザーデータのストレージサイズが含まれます。ステートメントの例:

SELECT * FROM hg_table_storage_status('<schema_name>', '<table_name>');

パラメータ

説明

schema_name

テーブルが属するスキーマの名前。

table_name

テーブルの名前。

次の表に、関数が返す結果の列を示します。

説明

table_name

  • 非パーティションテーブルの場合、テーブルの名前が返されます。

  • 親テーブルの場合、その子テーブルの名前が別々の行に返されます。各行は子テーブルを表します。

  • 子テーブルの場合、子テーブルの名前が返されます。

hot_size

ホットストレージ層のデータサイズ。単位:バイト。

cold_size

コールドストレージ層のデータサイズ。単位:バイト。

status

データのストレージ状態。有効な値:

  • hot:データはホットストレージ層に保存されます。

  • cold:データはコールドストレージ層に保存されます。

  • transferring:データは移行中です。

ステートメントの例:

-- 非パーティションテーブルのデータのストレージ状態をクエリします。
/* 非パーティションテーブルのデータのストレージ状態をクエリします。 */
SELECT * FROM hg_table_storage_status('public', 'tbl1'); -- 戻り値のデータサイズはバイト単位です。
/* 戻り値のデータサイズはバイト単位です。 */
 table_name | hot_size |   cold_size   | status
------------+----------+---------------+--------
 tbl1       |  145643  |      3685     | transferring

-- パーティションテーブルのデータのストレージ状態をクエリします。
/* パーティションテーブルのデータのストレージ状態をクエリします。 */
SELECT * FROM hg_table_storage_status('public', 'tbl2');-- 戻り値のデータサイズはバイト単位です。
/* 戻り値のデータサイズはバイト単位です。 */
   table_name    | hot_size | cold_size | status
-----------------+----------+-----------+--------
 tbl2_2022062222 |        0 |         0 | hot
 tbl2_2022062221 |     1125 |         0 | hot
 tbl2_2022062220 |     1245 |         0 | hot
 tbl2_2022062219 |     1358 |         0 | hot
 tbl2_2022062218 |        0 |      1875 | cold
 tbl2_2022062217 |        0 |      1143 | cold
 tbl2_2022062216 |        0 |      1299 | cold

テーブルデータのアクセス頻度をクエリする

Hologres V1.3.37 以降では、Hologres インスタンス内のテーブルの統計情報を毎日収集し、hologres.hg_table_info という名前のシステムテーブルに保存します。これにより、テーブルの統計情報をクエリおよび分析し、統計分析の結果に基づいて最適化対策を講じることができます。詳細については、「テーブル統計のクエリと分析」をご参照ください。このシステムテーブルをクエリして、テーブルに保存されているホットデータとコールドデータの量、テーブルデータのアクセス頻度、パーティションデータのアクセス頻度などの情報を取得できます。次に、取得した情報に基づいて、ホットデータとコールドデータを移行するかどうかを決定できます。次のサンプルコードは、このシステムテーブルを使用してインスタンス内のテーブルの統計情報をクエリする方法の例を示しています。

非パーティションテーブル

SELECT a.table_name,
       (a.total_read_count - b.total_read_count) AS read_count,
       (a.total_write_count - b.total_write_count) AS write_count,
       a.hot_storage_size
FROM (SELECT * FROM hologres.hg_table_info
      WHERE type='TABLE' AND collect_time::DATE = CURRENT_DATE - interval '1 day') a
JOIN
    (SELECT * FROM hologres.hg_table_info
    WHERE type='TABLE' AND collect_time::DATE = CURRENT_DATE - interval '${days} day') b
ON a.table_name = b.table_name
ORDER BY hot_storage_size DESC;

パーティションテーブル

すべてのパーティションのアクセス頻度をクエリします。

SELECT parent_table_name,count(*) AS partition_cnt, 
       sum(hot_storage_size)/1024/1024/1024 AS hot_size_gb 
FROM hologres.hg_table_info
WHERE type = 'PARTITION' AND collect_time::DATE = CURRENT_DATE - interval '1 day'
GROUP BY parent_table_name
ORDER BY hot_size_gb DESC;

指定されたパーティションのアクセス頻度をクエリします。

SELECT a.table_name,
      (a.total_read_count - b.total_read_count) as read_count,
      (a.total_write_count - b.total_write_count) as write_count,
       a.hot_storage_size
FROM (SELECT * FROM hologres.hg_table_info
      WHERE type = 'PARTITION'
      AND parent_table_name = '${p_table_name}'
      AND collect_time::DATE = CURRENT_DATE - interval '1 day') a
JOIN
     (SELECT * FROM hologres.hg_table_info
     WHERE type = 'PARTITION'
     AND parent_table_name = '${p_table_name}'
     AND collect_time::DATE = CURRENT_DATE - interval '${days} day') b
ON a.table_name = b.table_name
ORDER BY table_name DESC;