テーブルでシステムの書き込み時刻ではなく、ビジネスタイムスタンプ (イベント時刻やトランザクション時刻など) を使用してデータの鮮度を判断する場合、その列に基づいてホットデータとコールドデータを階層化するように LindormTable を設定できます。LindormTable は、カスタム時間列の値が設定された境界を超えると、行全体をコールドストレージにアーカイブします。最近の行は低レイテンシのクエリを実現するために高速ストレージに残り、古い行はコストを削減するためにコールドストレージに移行します。ホットデータとコールドデータは同じテーブルに残るため、カスタム時間列でフィルタリングすると、クエリは透過的に正しいストレージ階層にルーティングされます。
前提条件
開始する前に、以下を確認してください。
インスタンスでコールドストレージが有効化されています。詳細については、「容量ストレージを有効化する」をご参照ください。
LindormTable のバージョンが 2.4.3 以降であること。バージョンの確認またはアップグレードについては、「LindormTable バージョンガイド」および「マイナーバージョンの更新の実行」をご参照ください。
Lindorm-cli を介して LindormTable に接続できること。詳細については、「Lindorm-cli を使用した LindormTable への接続と利用」をご参照ください。
対象のテーブルまたはカラムファミリーの STORAGE_POLICY が
COLDに設定されていないこと。コールドストレージテーブルは、コールド・ホットデータ分離には使用できません。ストレージプロパティを変更するには、「コールドストレージの設定」をご参照ください。
制限事項
この機能は 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 を使用します。スペースがあるとエラーが発生します。
パラメーター | 説明 |
| コールド・ホットデータ分離の境界 (秒単位)。このしきい値より古いデータ (カスタム時間列に基づく) は、コンパクション中にコールドストレージにアーカイブされます。例: |
| レイヤー2のストレージプロパティ。アーカイブされたデータをコールドストレージに転送するには、 |
| カスタム時間列とその時間単位。形式: |
| テーブルの圧縮アルゴリズム。大文字と小文字は区別されません。デフォルトは |
方法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 に再びコールドになります。
プライマリキーの一部であるカスタム時間列の値は更新できません。
カスタム時間列に値がない行のデータは、分離の対象になりますか?
いいえ。カスタム時間列に値がない行は、ホットストレージに保持されます。