全部產品
Search
文件中心

Hologres:字典編碼Dictionary Encoding

更新時間:Jun 30, 2024

如果您資料表中欄位的基數相對較小,使用字典編碼可以提高資料的壓縮率,以減少資料存放區量和提高查詢效能。Hologres支援對指定欄位進行字典編碼,本文為您介紹在Hologres中設定字典編碼的命令及原理。

Dictionary Encoding介紹

字典編碼可以將字串的比較轉成數位比較,加速Group By、Filter等查詢,同時也會提升資料的壓縮比,進一步降低儲存。在Hologres中可以對指定欄位進行字典編碼,即為指定欄位的值構建字典映射,設定Dictionary Encoding的命令文法如下。

-- Hologres V2.1版本起支援的文法
CREATE TABLE <table_name> (...) WITH (dictionary_encoding_columns = '[<columnName>{:[on|off|auto]}[,...]]');

-- 所有版本支援的文法
CREATE TABLE <table_name> (...);
CALL set_table_property('table_name', 'dictionary_encoding_columns', '[<columnName>{:[on|off|auto]}[,...]]');

參數說明:

參數

說明

table_name

表名稱。

on

表示當前欄位進行字典編碼。

off

表示當前欄位關閉字典編碼。

auto

表示系統自動決定是否開啟字典編碼。如果設定了auto,Hologres會根據所在列數值的重複程度自動選擇是否進行字典編碼,值的重複度越高,字典編碼的收益越大。

  • 在Hologres V0.8版本及更早版本中,預設所有TEXT類型欄位都會被設定開啟字典編碼。

  • 在Hologres V0.9及之後版本中,所有TEXT資料類型欄位的dictionary_encoding_columns屬性預設取值auto。當表有資料寫入時,如果欄位裡數值的重複度大於等於90%,那麼系統就會對該欄位開啟字典編碼。

使用建議

  • 建議將有字串比較的列設定為字典編碼列(dictionary_encoding_columns),並且列的基數較小,即資料重複度較高。

  • 不建議將所有的列都設定為字典編碼列,因為這樣做會帶來額外的編碼、解碼開銷。

  • 不建議為實際內容為JSON,但儲存為text類型的列設定字典編碼。

  • 可以在建表之後單獨使用設定字典編碼。表示修改字典編碼列,修改之後非立即生效,字典編碼構建和刪除在後台非同步執行,詳情請參見ALTER TABLE

  • 不建議關閉字典編碼,會使得資料壓縮少,儲存有一定的增加。建議dictionary_encoding_columns值設定為auto

使用說明

  • Dictionary Encoding只能用於列存表或者行列共存表。

  • Dictionary Encoding指定的列可以為空白。

  • 取值較少的列適合設定字典編碼,可以壓縮儲存。

  • Hologres V0.8及更早版本中預設所有TEXT類型欄位都會被隱式地設定為Dictionary Encoding。Hologres V0.9及之後版本中,所有TEXT資料類型欄位的dictionary_encoding_columns屬性預設取值auto。即當表有資料寫入時,如果欄位裡數值的重複度大於等於90%,那麼系統就會對該欄位開啟字典編碼。

技術原理

Dictionary Encoding是一種壓縮儲存的技術,系統會將未經處理資料編碼為數實值型別儲存,同時也會維護對應的編碼錶結構,在資料讀取時,會根據編碼錶進行資料解碼操作,因此在字串比較的情境中,尤其是對基數小的列,有加速作用,常用於Group By、Filter等過濾查詢情境中。系統會預設將TEXT資料類型的欄位設定Dictionary Encoding。但是解碼會帶來額外的計算開銷,尤其是基數大的列(資料的重複度較低,比如一列裡一半值都不相同)和用於Join的欄位,字典編碼會帶來更多額外的編碼、解碼開銷,因此不建議所有的列都設定為Dictionary Encoding。字典編碼示意圖如下所示。字典編碼

使用樣本

  • V2.1版本起支援的文法:

    CREATE TABLE tbl (
        a int NOT NULL,
        b text NOT NULL,
        c text NOT NULL
    )
    WITH (
        dictionary_encoding_columns = 'a:on,b:off,c:auto'
    );
    
    -- 修改dictionary_encoding_columns
    ALTER TABLE tbl SET (dictionary_encoding_columns = 'a:off');--ALTER TABLE文法僅支援全量修改
  • 所有版本支援的文法:

    --建立表tbl並設定dictionary_encoding_columns索引
    begin;
    create table tbl (
      a int not null,
      b text not null,
      c text not null
    );
    call set_table_property('tbl', 'dictionary_encoding_columns', 'a:on,b:off,c:auto');
    commit;
    
    --修改dictionary_encoding_columns索引
    call set_table_property('tbl', 'dictionary_encoding_columns', 'a:off');--全量修改,b和c因為是text列,會被預設設定為dictionary_encoding_columns
    
    call update_table_property('tbl', 'dictionary_encoding_columns', 'c:off');--增量修改,僅將c關閉dictionary_encoding_columns

相關文檔

根據業務查詢情境設定合適的表屬性指南,請參見情境化建表調優指南