更改列存表的数据存储格式

从Hologres V0.10版本开始,Hologres创建的列存表数据存储格式升级为AliORC,该存储格式能够进一步压缩数据存储大小,降低存储成本。本文将会为您介绍在Hologres中如何更改列存表的数据存储格式。

使用限制

在Hologres中更改列存表的数据存储格式,具体限制如下:

  • 该功能仅Hologres V0.10及以上版本支持,请在Hologres管控台的实例详情页查看当前实例版本,如果您的实例是V0.10以下版本,请您使用自助升级或加入Hologres钉钉交流群反馈,详情请参见如何获取更多的在线支持?

  • 升级前的数据列存表存储格式为segment,升级至Hologres V0.10版本后,新建的列存表将会默认为AliORC(参数值为orc)存储格式,行存表为sst存储格式。当前版本支持对升级前的历史数据更换,但有如下限制:

    • 当前版本仅支持单表转换列存表存储格式,不支持批量转换。

    • 针对分区表,仅需对父表进行列存数据存储格式转换操作即可。

    • 转换数据存储格式后,通过后台线程异步将旧的format数据切换到新的format上。后台异步切换过程会消耗系统资源,包括CPI、I/O、网络等,切换期间可能会对线上任务有一定的性能影响,整个切换时长跟存量数据大小以及实时写入量相关,请在业务低峰期进行切换

  • 不支持通过修改存储格式完成列存表转换为行存表,如需变换,请重新创建新的表结构。

查看数据存储格式

您可以使用如下SQL语句查看数据库中各张表的存储格式:

  • 语法示例

    SELECT  *
    FROM    hologres.hg_table_properties
    WHERE   property_key = 'storage_format'
    ;
  • 查询结果

     table_namespace |     table_name     |  property_key  | property_value 
    -----------------+--------------------+----------------+----------------
     public          | part               | storage_format | segment
     public          | partsupp           | storage_format | segment
     public          | customer           | storage_format | segment
     public          | orders_row         | storage_format | sst
     public          | sp_orders          | storage_format | segment
     public          | sp_orders_20161231 | storage_format | segment
     public          | sp_orders_20171231 | storage_format | segment
     public          | sp_orders_20181231 | storage_format | segment
     public          | lineitem           | storage_format | segment
     public          | nation             | storage_format | orc
     public          | region             | storage_format | orc
     public          | supplier           | storage_format | orc
     public          | orders             | storage_format | orc
    (13 rows)
  • 查询结果参数说明

    参数

    说明

    segment

    Hologres早期版本列存表的默认格式。

    sst

    行存表的默认格式。

    orc

    Hologres V0.10及以上版本列存表的默认格式。其中property_value为orc的即为使用AliORC格式存储数据的表。

更新表的数据存储格式

在您升级Hologres实例至V0.10版本后,默认创建的表均会以AliORC格式存储数据。但是已经存在的数据表需要您手工修改其存储类型,命令语法如下:

call set_table_property ('table_name', 'storage_format', 'orc');

其中,您需要将table_name替换为实际的表名。如下示例将表part的存储类型更换为AliORC存储格式。

call set_table_property ('public.part', 'storage_format', 'orc');

批量转换Segment为ORC格式

从Hologres V1.3后续版本开始,将不再支持创建表时设置存储格式为Segment,建议尽早将Segment格式切换为ORC格式。涉及的场景如下。

  • 新建表。

    新建表如果设置为Segment格式,从Hologres V1.3.29版本开始,系统将会自动将Segment格式转换为ORC格式,因此,在执行建表语句时将会收到如下提示:

    NOTICE:storage format 'segment' is no longer supported,converted to 'orc'
  • 存量Segment表。

    如果是已经创建的Segment存量表,可以通过以下步骤进行ORC格式的批量转换。

    1. 查看当前数据库已有的Segment格式表。

      说明

      如果查询结果为空,说明当前数据库已经没有需要切换的表、或者所有需要切换的表都已经在后台切换当中,无需进一步处理。

      select * from hologres.hg_table_properties
      where property_key = 'storage_format' and property_value like '%segment%';
    2. 批量将Segment格式转换成ORC格式。

      从Hologres V1.3.35版本开始,支持将Segment格式的表批量转换成ORC格式的表。命令语法如下。

      call hg_convert_segment_orc([<BATCH_SIZE>]);

      其中BATCH_SIZE为可选参数,代表同时进行切换的表数量,可以为空,默认为100。

      命令说明:

      • 该命令语句是异步执行的,所以会直接返回成功,但会在系统后台进行格式转换。转换过程中需要占用一定的CPU和内存资源(指标上涨),对线上业务的运行有一定影响,因此请尽量在业务低峰期进行切换。常会在数分钟到若干小时结束,可以通过查看CPU和内存指标观察是否下降,下降则说明转换完成。

      • 当命令返回为空时,说明当前数据库已经没有需要切换的表、或者所有需要切换的表都已经在后台切换当中,无需进一步处理,可以继续处理下个数据库。

      • 如果命令返回类似continue to call hg_convert_segment_orc() if you want to convert all tables in current database.的提示,说明还有需要切换的表。需要根据集群负载情况,继续执行该命令,直到返回空为止。