字典编码Dictionary Encoding

如果您数据表中字段的基数相对较小,使用字典编码可以提高数据的压缩率,以减少数据存储量和提高查询性能。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

相关文档

根据业务查询场景设置合适的表属性指南,请参见场景化建表调优指南