如果您資料表中欄位的基數相對較小,使用字典編碼可以提高資料的壓縮率,以減少資料存放區量和提高查詢效能。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 | 表示系統自動決定是否開啟字典編碼。如果設定了
|
使用建議
建議將有字串比較的列設定為字典編碼列(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
相關文檔
根據業務查詢情境設定合適的表屬性指南,請參見情境化建表調優指南。