全部產品
Search
文件中心

Lindorm:按自訂時間列冷熱分離

更新時間:Dec 27, 2024

Lindorm寬表引擎支援按自訂時間列歸檔冷熱資料。購買容量型雲端儲存後,您可以指定表或二級索引中的某個時間列作為冷熱分離的依據,將資料分別儲存於不同的介質中,有效提升熱資料查詢效率,降低冷資料存放區成本。本文介紹按自訂時間列冷熱分離的具體操作步驟及相關注意事項。

前提條件

注意事項

  • 僅支援Lindorm SQL,不支援HBase相容使用方式。

  • 當自訂時間列中的值越過設定的冷熱分界線後,整行資料會被歸檔至冷儲存中。

  • 自訂時間列的設定需遵循以下規則:

    • 自訂時間列必須為主鍵。

    • 自訂時間列不能作為主鍵第一列。

    • 自訂時間列僅支援BIGINT和TIMESTAMP類型。如果指定列不存在、資料沒有寫入或寫入的資料類型不正確,資料則無法冷熱分離,將被全部寫入熱儲存。

操作步驟

設定表的冷熱分界線

  1. 設定自訂時間列及冷熱分界線。

    • 方法一:建表時設定。

      建立表dt,設定冷熱分離時間點為一天,按p2列冷熱分離。

      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'); 

      參數說明

      • CHS:冷熱分離時間點,單位為秒(s)。例如CHS為86400,代表自訂時間列的時間戳記取值在86400秒(一天)前的資料會被自動歸檔到冷儲存。

      • COMPRESSION:壓縮演算法。整張表生效。演算法名稱大小寫不敏感。預設配置為none。

      • CHS_L2:配置第二層屬性,一般配置儲存屬性:storagetype=COLD

      • CHS_COLUMN:自訂時間列。

    • 方法二:建表時未開啟冷熱分離,通過ALTER TABLE語句添加相關屬性。

      -- 已有資料表、建表時未開啟冷熱分離,例如:
      -- CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar,  constraint pk primary key(p1, p2, p3));
      
      -- 為表dt開啟按自訂欄冷熱分離,設定冷熱分離時間點為一天,按p2列冷熱分離
      ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2';
  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'='';
    說明

    修改冷熱分界線或取消冷熱分離後,需要等待系統後台執行完compaction,資料才能從冷儲存回到熱儲存中。如果需要資料立即回到熱儲存,請手動執行major_compact命令。

設定二級索引的冷熱分界線

二級索引預設儲存在一張表中,因此,二級索引可以像表一樣進行冷熱分離。

以上文建立的表dt為例,為表dt建立二級索引。

  1. 建立二級索引並開啟冷熱分離。

    • 方法一:建立二級索引時設定自訂時間列及冷熱分界線。

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

      二級索引無法指定自訂時間列,CHS_COLUMN必須設定為主表的自訂時間列。

    • 方法二:建立二級索引時未設定,通過ALTER TABLE設定自訂時間列及冷熱分界線。

      -- 已有二級索引、建立二級索引時未開啟冷熱分離,例如:
      -- CREATE INDEX idx on dt (c1);
      
      -- 為二級索引表開啟冷熱分離,設定冷熱分離時間點為一天,按p2列冷熱分離
      ALTER TABLE `dt.idx` SET 'CHS' = '86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN'='COLUMN=p2';
  2. 可選:修改二級索引的冷熱分界線和自訂時間列。

    • 修改冷熱分界線。

      ALTER TABLE `dt.idx` SET 'CHS'='10000';
    • 修改自訂時間列。

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

    二級索引表的表名格式為表名+點號(.)+二級索引名。由於二級索引表名中有特殊符號,使用時必須在表名前後添加反引號(`)進行轉義。例如,原表名為test.idx,轉義後的表名為`test.idx`

  3. 可選:取消二級索引的冷熱分離。

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

資料寫入

冷熱分離的表與普通表的資料寫入方式完全一致,資料會先儲存在熱儲存(標準型/效能型)中。隨著時間的推移,如果一行資料滿足目前時間-時間列值>CHS設定的值條件,則會在執行compaction時被歸檔到冷儲存中。

資料查詢

由於冷熱資料都在同一張表中,因此使用者所有的查詢操作都只需在一張表內進行。在查詢時,建議通過自訂時間列來限定資料查詢的時間範圍,系統將會根據指定的時間範圍決定查詢模式,即僅查詢熱儲存區、僅查詢冷儲存區或同時查詢冷儲存區和熱儲存區。如果查詢時未限定時間範圍,則會導致查詢命中冷資料,進而使得查詢吞吐受到冷儲存的限制。詳細內容,請參見容量型雲端儲存

如果查詢條件中無法設定自訂時間列,也可以使用HINT設定_l_hot_only_參數的屬性來避免查詢冷資料。

查詢樣本

  • 隨機查詢Get

    -- p2為自訂時間列
    SELECT * FROM dt WHERE p1 = 10 AND p2 = 10;
  • 範圍查詢Scan

    -- p2為自訂時間列
    SELECT * FROM dt WHERE p2 > 10 AND p2 < 1000;
    重要

    當執行SELECT語句被識別為低效查詢時,寬表引擎預設不允許執行該類查詢,同時會拋出異常。詳細介紹及解決方案,請參見SELECT

  • 通過HINT僅查詢熱資料

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

最佳實務

在車連網情境中,一般將表的主鍵設計為vin(車架號)和時間戳記列,並將時間戳記列定義為冷熱分離的自訂時間列。在查詢一輛車某段時間內的資料時,系統可以根據查詢條件定位到是否需要查詢冷資料,或是否僅查詢熱資料。

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;

常見問題

  • Q:如果更新了原有的冷資料,更新後的資料還是冷資料嗎?

    A:如果更新的冷資料不是自訂時間列,那麼更新後的資料依舊是冷資料;如果更新的是自訂時間列中的資料,則需要根據新寫入的時間內容來重新劃分冷熱資料。假設一個表的主鍵列為p1,p2, 非主鍵列為c1,c2,某一行為p1=row1, p2=2023.1.28日, c1=”c1“, c2=”c2“,冷熱分界線CHS=1天,目前時間為2023.1.30日,此時這一行為冷資料。如果更新這一行中的c1,c2列的值,那麼這一行仍然為冷資料;如果將這一行中p2的值更新為2023.1.30日,那麼這一行將變為熱資料,直到2023年2月1日(2天后),才會重新變為冷資料。

    說明

    已設定為主鍵的自訂時間列中的值無法更新。

  • Q:如果在一行資料中未寫入自訂時間列,那麼這一行資料還會冷熱分離嗎?

    A:不會。自訂時間列是系統對資料冷熱分離儲存的依據。如果一行資料未寫入時間,那麼這行資料會被保留在熱儲存區。