本文为您介绍Hologres中字典编码Dictionary Encoding使用相关内容。
Dictionary Encoding介绍
字典编码可以将字符串的比较转成数字的比较,加速Group By、Filter等查询。在Hologres中可以对指定字段进行字典编码,即为指定字段的值构建字典映射,设置Dictionary Encoding的命令语法如下。
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只能用于列存表或者行列共存表。
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。字典编码示意图如下所示。
使用示例
--创建表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