从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格式的批量转换。
查看当前数据库已有的Segment格式表。
说明如果查询结果为空,说明当前数据库已经没有需要切换的表、或者所有需要切换的表都已经在后台切换当中,无需进一步处理。
select * from hologres.hg_table_properties where property_key = 'storage_format' and property_value like '%segment%';
批量将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.
的提示,说明还有需要切换的表。需要根据集群负载情况,继续执行该命令,直到返回空为止。