当离线导入大量数据或大量执行delete
、update
操作后,可能会由于数据文件的碎片化导致读写性能下降,此时需要执行压缩(Compaction)操作。Compaction操作将多个数据文件合并成一个更大的数据文件,执行Compaction操作有助于重新组织数据存储结构,提高读写效率。本文介绍在Hologres中如何进行Compaction操作。
背景信息
Hologres的数据写入模型使用了与LSM-Tree类似的数据结构,数据都是以Append Only的方式写入存储的。这种数据结构可以将随机写变为顺序写,这是一种面向写优化的数据结构,能够有效提升写入的吞吐量。写入的数据文件需要通过Compaction合并成一个更大的数据文件。
Hologres中存在两类Compaction操作:
Auto Compaction
Hologres的Auto Compaction是分层的。最多有五层,当单层文件超过五个时,会自动触发Compaction,Compaction完成后的文件会放到下一层。例如Level 0的文件达到五个后,会自动触发Compaction,将五个文件合并,合并后的文件默认最大为64 MB,如果文件大小超过64 MB后,会生成多个文件,合并后的文件会放到Level 1,示意图如下所示:
Full Compaction
Auto Compaction只会发生在某层内部,不会跨层合并文件。Full Compaction会将所有层的所有文件进行合并,合并后每个文件默认的最大的大小为64 MB,合并后的文件会放到最后一层。
使用限制
仅Hologres V2.1及以上版本支持手动触发Full Compaction,如果您的实例是V2.1以下版本,请您使用自助升级或加入实时数仓Hologres交流群申请升级实例,详情请参见如何获取更多的在线支持?
仅列存表和行列共存表可以主动触发Full Compaction。
行列共存表执行Full Compaction之后,仅列存部分会执行Full Compaction。
使用说明
使用场景:
对于如下场景可以主动触发Full Compaction,合并小文件,提升查询效率:
离线导入大量数据后。
大量执行
delete
或者update
操作之后。
说明Full Compaction时会占用大量IO和CPU资源,请在写入低峰期执行。一般执行会持续10分钟以上。
命令语法:
SELECT hologres.hg_full_compact_table( '<schema_name.table_name>' [,'max_file_size_mb=<value>'] );
参数说明:
参数名称
说明
是否必填
默认值
schema_name.table_name
需要执行Full Compaction操作的表名称。
是
无
max_file_size_mb
(不推荐随意更改)指定需要执行Full Compaction后生成文件的最大大小,取值必须是正整数,单位为
MB
。若调小此参数值,会导致数据文件变多,文件过多会导致查询变慢。
否
64
使用示例:
对表
public.lineitem
执行Full Compaction操作:SELECT hologres.hg_full_compact_table( 'public.lineitem');
对表
public.lineitem
执行Full Compaction操作,指定合并后输出的文件大小最大为256 MB:SELECT hologres.hg_full_compact_table( 'public.lineitem', 'max_file_size_mb=256' );