如果您数据表中字段的基数相对较小,使用字典编码可以提高数据的压缩率,以减少数据存储量和提高查询性能。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
相关文档
根据业务查询场景设置合适的表属性指南,请参见场景化建表调优指南。