如果您數據表中字段的基數相對較小,使用字典編碼可以提高數據的壓縮率,以減少數據存儲量和提高查詢性能。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
相關文檔
根據業務查詢場景設置合適的表屬性指南,請參見場景化建表調優指南。
關于更多Hologres內部表DDL語句詳情,請參見: