当离线导入大量数据或大量执行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' );
 
使用Serverless Computing执行Compaction
Serverless Computing对数据导入后的Compaction支持情况如下:
- V3.1.11版本前,使用Serverless Computing执行数据导入任务时,后台的异步Compaction任务仍会使用本实例资源执行。 
- V3.1.11版本起,使用Serverless Computing执行数据导入任务时,支持使用Serverless资源同步完成对新数据文件的Compaction,不再占用本实例资源。该功能会少量增加数据导入时长,同时极大提升实例稳定性。该功能有如下前提条件: - 需开启GUC参数 - hg_serverless_computing_run_compaction_before_commit_bulk_load。
- 仅支持对新数据文件的同步Compaction。如果表存在旧文件TTL过期需Compaction清理文件,仍会使用本实例资源异步执行。 
- 同步Compaction仅支持导入热存(标准存储),暂不支持导入冷存(低频访问存储)。