Compaction(Beta)

当离线导入大量数据或大量执行deleteupdate操作后,可能会由于数据文件的碎片化导致读写性能下降,此时需要执行压缩(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,示意图如下所示:

    image.png

  • 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'
      );