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

Lindorm:カスタム時間列に基づくコールド・ホットデータ分離

最終更新日:Sep 17, 2026

テーブルでシステムの書き込み時刻ではなく、ビジネスタイムスタンプ (イベント時刻やトランザクション時刻など) を使用してデータの鮮度を判断する場合、その列に基づいてホットデータとコールドデータを階層化するように LindormTable を設定できます。LindormTable は、カスタム時間列の値が設定された境界を超えると、行全体をコールドストレージにアーカイブします。最近の行は低レイテンシのクエリを実現するために高速ストレージに残り、古い行はコストを削減するためにコールドストレージに移行します。ホットデータとコールドデータは同じテーブルに残るため、カスタム時間列でフィルタリングすると、クエリは透過的に正しいストレージ階層にルーティングされます。

前提条件

開始する前に、以下を確認してください。

制限事項

  • この機能は Lindorm SQL でのみサポートされています。HBase 互換の操作はサポートされていません。

  • 行のカスタム時間列の値がホットデータの境界を超えると、行全体がコールドストレージにアーカイブされます。

  • カスタム時間列は、以下のすべての条件を満たす必要があります。

    • プライマリキー列である必要があります。

    • プライマリキーの最初の列であってはなりません。

    • データ型は BIGINT または TIMESTAMP である必要があります。列が存在しない、データがない、または正しくないデータ型のデータが含まれている場合、すべてのデータはホットストレージに書き込まれます。

テーブルのコールド・ホットデータ分離の設定

手順1:カスタム時間列とデータ境界の設定

テーブルがすでに存在するかどうかに基づいて、以下のいずれかの方法を選択します。

方法1:テーブル作成時の設定

以下の例では、列 p2 をカスタム時間列として使用し、1 日のコールド・ホットデータ分離境界を持つ dt という名前のテーブルを作成します。

説明

カスタム時間列 (この例では p2) はプライマリキー列である必要がありますが、プライマリキーの最初の列にすることはできません。

-- デフォルトの時間単位:ミリ秒 (ms)
CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk PRIMARY KEY(p1, p2, p3))
WITH(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=p2');

-- 時間単位を秒 (s) に設定
CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk PRIMARY KEY(p1, p2, p3))
WITH(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=p2|TIMEUNIT=SECONDS');

-- 時間単位を分 (min) に設定
CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk PRIMARY KEY(p1, p2, p3))
WITH(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=p2|TIMEUNIT=MINUTES');
重要

CHS_COLUMN の等号 (=) の両側にスペースを追加しないでください。たとえば、COLUMN = p2 ではなく COLUMN=p2 を使用します。スペースがあるとエラーが発生します。

パラメーター

説明

CHS

コールド・ホットデータ分離の境界 (秒単位)。このしきい値より古いデータ (カスタム時間列に基づく) は、コンパクション中にコールドストレージにアーカイブされます。例:86400 = 86,400 秒 = 1 日。

CHS_L2

レイヤー2のストレージプロパティ。アーカイブされたデータをコールドストレージに転送するには、storagetype=COLD に設定します。

CHS_COLUMN

カスタム時間列とその時間単位。形式:COLUMN=<column_name>|TIMEUNIT=<unit>。デフォルトの単位はミリ秒 (ms) です。サポートされている単位:SECONDS、MINUTES、MICROSECONDS、NANOSECONDS。

COMPRESSION

テーブルの圧縮アルゴリズム。大文字と小文字は区別されません。デフォルトは none です。

方法2:既存のテーブルへの分離機能の追加

ALTER TABLE を使用して、分離機能なしで作成されたテーブルでコールド・ホットデータ分離を有効にします。

-- 1日の境界でコールド・ホットデータ分離を有効化し、p2 を使用 (デフォルト単位:ミリ秒)
ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2';

-- p2 を使用し、時間単位を秒に設定
ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2|TIMEUNIT=SECONDS';

-- p2 を使用し、時間単位を分に設定
ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2|TIMEUNIT=MINUTES';

設定の確認

以下のいずれかの方法で設定を確認します。

  • SHOW TABLE VARIABLES FROM dt LIKE 'CHS_COLUMN'; を実行してテーブルのプロパティを表示します。

  • クラスター管理システムで、[概要] ページに移動し、テーブル名をクリックします。[現在のテーブル詳細] エリアで、[CHS] と [CHS_COLUMN] の値を確認します。

手順2 (任意):設定の変更

コールド・ホットデータ分離境界の変更:

ALTER TABLE dt SET 'CHS'='1000';

カスタム時間列の変更:

ALTER TABLE dt SET 'CHS_COLUMN'='COLUMN=p3';

手順3 (任意):コールド・ホットデータ分離の無効化

ALTER TABLE dt SET 'CHS'='', 'CHS_L2' = '', 'CHS_COLUMN'='';
説明

境界を変更したり、分離を無効にしたりしても、データはすぐにコールドストレージからホットストレージに戻りません。システムは、バックグラウンドでのコンパクションが完了するまで待機します。データをすぐにホットストレージに戻すには、major_compact コマンドを使用して手動でメジャーコンパクションを実行します。

セカンダリインデックスのコールド・ホットデータ分離の設定

セカンダリインデックスはベーステーブル内に格納されるため、設定方法は同じです。以下の例では、前のセクションで作成した dt テーブルを使用します。

説明

セカンダリインデックスの場合、CHS_COLUMN はベーステーブルと同じカスタム時間列を参照する必要があります。別の列を指定することはできません。

分離を有効にしたセカンダリインデックスの作成

方法1:セカンダリインデックス作成時の設定

CREATE INDEX idx ON dt (c1) WITH(CHS = '86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN='COLUMN=p2');

方法2:既存のセカンダリインデックスへの分離機能の追加

-- 既存のインデックスでコールド・ホットデータ分離を有効化
ALTER TABLE `dt.idx` SET 'CHS' = '86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN'='COLUMN=p2';
説明

セカンダリインデックスのテーブル名は TableName.IndexName という形式です。ピリオド (.) は特殊文字であるため、名前をバッククォート (`) で囲みます。たとえば、dt.idx ではなく `dt.idx` と記述します。

セカンダリインデックスの設定変更または無効化

コールド・ホットデータ分離境界の変更:

ALTER TABLE `dt.idx` SET 'CHS'='10000';

カスタム時間列の変更:

ALTER TABLE `dt.idx` SET 'CHS_COLUMN'='COLUMN=p2';

分離の無効化:

ALTER TABLE `dt.idx` SET 'CHS'='', 'CHS_L2' = '', 'CHS_COLUMN'='';

データの書き込み

コールド・ホットデータ分離が有効になっているテーブルへのデータ書き込みは、標準テーブルへの書き込みと同様に動作します。データは最初にホットストレージ (Medium または Compute-optimized) に格納されます。以下の条件が満たされると、コンパクション中にコールドストレージにアーカイブされます。

現在の時刻 - 時間列の値 > CHS の値

データのクエリ

ホットデータとコールドデータは同じテーブルに存在します。すべてのクエリは、その単一のテーブルを対象とします。時間範囲を指定してカスタム時間列でフィルタリングすると、LindormTable はそれを使用してホットストレージ、コールドストレージ、またはその両方をスキャンするかどうかを判断するため、クエリは関連する階層のみを読み取ります。時間範囲フィルターがない場合、クエリはコールドデータにアクセスする可能性があり、スループットはコールドストレージの容量によって制限されます。詳細については、「Capacity storage の読み取りスロットリング」をご参照ください。

カスタム時間列でフィルタリングできない場合にホットデータのみをクエリするには、_l_hot_only_ ヒントを使用します。

クエリ例

ランダムクエリ (Get)

-- p2 はカスタム時間列
SELECT * FROM dt WHERE p1 = 10 AND p2 = 10;

範囲クエリ

-- p2 はカスタム時間列
SELECT * FROM dt WHERE p2 > 10 AND p2 < 1000;
重要

デフォルトでは、LindormTable は非効率なクエリと判断された SELECT 文を実行せず、例外をスローします。詳細については、「SELECT」をご参照ください。

ヒントを使用したホットデータのみのクエリ

SELECT /*+ _l_hot_only_(true) */ * FROM dt WHERE p1 > 1;

例:IoV (Internet of Vehicles) シナリオ

IoV (Internet of Vehicles) シナリオでは、プライマリキーは通常 vin (車両識別番号) と ts (タイムスタンプ) で構成されます。ts をカスタム時間列として定義します。特定の車両のデータを時間範囲内でクエリすると、LindormTable はクエリ条件に基づいてホットストレージとコールドストレージのどちらにアクセスするかを自動的に決定します。

USE test;
CREATE TABLE dt (
  vin varchar, ts bigint, c1 varchar, c2 varchar,
  constraint pk primary key(vin, ts)
) WITH (COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=ts');

-- 特定の車両のデータを時間範囲内でクエリ
SELECT * FROM dt WHERE vin = 'xxxx' AND ts > 1675065122000 AND ts < 1675975222000;

よくある質問

既存のコールドデータを更新した場合、更新後のデータはコールドのままですか?

はい、更新によってカスタム時間列の値が変更されない場合はコールドのままです。値が変更された場合、LindormTable は新しい値に基づいて行のホット/コールド状態を再評価します。

たとえば、あるテーブルにプライマリキー列 p1 と p2、および非プライマリキー列 c1 と c2 があるとします。ある行の値は p1=row1、p2=Jan-28-2023、c1="c1"、c2="c2" です。境界 (CHS) が 1 日で、現在の日付が Jan-30-2023 の場合、この行はコールドです。c1 または c2 を更新しても、行はコールドのままです。p2 を Jan-30-2023 に更新すると行はホットになり、Feb-01-2023 に再びコールドになります。

説明

プライマリキーの一部であるカスタム時間列の値は更新できません。

カスタム時間列に値がない行のデータは、分離の対象になりますか?

いいえ。カスタム時間列に値がない行は、ホットストレージに保持されます。