GaussDB(DWS)列存(auto)vacuum特性整理(一)——小CU&0CU合并解决

举报
东篱把酒 发表于 2023/12/14 10:40:29 2023/12/14
【摘要】 列存(auto)vacuum小CU&0CU合并解决小CU、0CU清理只能依靠vacuum full进行清理痛点,实现自动无感知的清理小CU、0CU,解决autovacuum仅能回收空间的局限性。

GaussDB(DWS)列存/hstore表数据存储方式为将每列的数据批量存储成一个CU(Compress Unit), 这样能带来了很好的空间压缩批量查询性能提升,但是随着业务继续,会导致列存/hstore表中产生大量小cu、0cu,在查询数据时,由于要遍历cudesc表,这些小cu、0cu会造成额外开销,导致查询性能下降。往常小CU、0CU清理只能依靠vacuum full进行清理,但是由于vacuum full属于ddl,需要持有8级表锁,会导致业务阻塞,列存(auto)vacuum小CU&0CU合并可以解决这个痛点,实现自动无感知的清理小CU、0CU,解决autovacuum仅能回收空间的局限性。

基本原理

小CU&0CU合并解决,在原(auto)vacuum流程中增加了如下图所示流程,在遍历cudesc时,识别出了3种CU,即0CU,小CU,正常CU。

0CU直接走0CU清理,即删除cudesc对应记录。

小CU合并走下图中绿色方框的流程,将数据重新导入到delta表中,使原小CU变成0CU,下次(auto)vacuum时走0CU清理逻辑清理掉。

适用场景

1:有些实时表入库量并不大,不定期会有入库,因为merge的判断标准有两个:6W行或者1小时,超过时间没有入库后也会强制merge,这种情况下merge产生的CU的行数不可控,可能产生小CU

2:对于维度表来说,很长时间才可能改变一次,每次都可能产生一个小CU,虽然不会有太多这种小CU,但长期运行后,很多这种维度表的情况下,总的小CU个数会非常可观

3:频繁upsertupdatedelete等更新后,6WCU其中大部分甚至全部数据被标记删除,这样的CU虽然空间上会被列存vacuum通过填充NULL进行回收,但是依然会导致小IOcudesc表的膨胀,进而影响性能

使用方法及约束

1.需要开启autovacuum,autovacuum_max_workers需要大于0,colvacuum_threshold_scale_factor不能设置-2

2.列存表只支持0CU的清理,不支持小CU合并;Hstore表可以同时支持0cu的清理和小CU合并,但是创建有psort索引的hstore表只支持0CU的清理,不支持小CU合并;维度表单独一个小CU且没有脏数据,不会触发小CU合并

3.调用系统函数gs_hstore_compaction手动触发合并小(0CU

  • 第一个参数传表名,第二个参数是可选参数,传入int值控制少于多少行会触发合并,默认100
  • 函数只支持hstore表,其他类型的表会返回空,打印warning
  • 函数同时完成0CU的清理和小CU的合并
  • Hstore_compaction(‘public.t1’),代表使用100作为默认的小CU行数阈值,触发一次小(0)CU的合并
  • Hstore_compaction(‘public,t1’, 500),代表使用500作为小CU行数阈值,触发一次小(0)CU的合并
  • Hstore_compaction上表4级锁,不能单表多并发compaction,和DML操作无锁冲突,但可能存在事务上的等待
  • Hstore_compaction不支持合并单个分区

4.通过设置autovacuum_compaction_rows_limit和autovacuum_compaction_time_limit控制手动vacuum和autovacuum 小CU&0CU合并 表现,具体见下表触发矩阵

  • autovacuum_compaction_rows_limit:默认-1关闭,可设置为(-1 5000)的整数,控制小CU的阈值。
  • autovacuum_compaction_time_limit:默认0关闭,可设置为(0 - 10080)的整数,单位是分钟,代表可以设置从1分钟到一周的时间范围,控制autovacuum合并小CU的时间触发维度。

 

autovacuum_compaction

_rows_limit

autovacuum_compaction

_time_limitmin

Hstore

列存表

0CU清理

CU合并

0CU清理

CU合并

Gs_hstore

_compaction

不受参数影响

不受参数影响

执行

执行

不执行

不执行

 

手动vacuum

-1

不受参数影响

不执行

不执行

不执行

不执行

0

不受参数影响

执行

不执行

执行

不执行

100

不受参数影响

执行

不执行

执行

不执行

 

 

 

 

 

Autovacuum

-1

0

不执行

不执行

不执行

不执行

60

不执行

不执行

不执行

不执行

0

0

执行

触发条件:dead记录数

不执行

执行

触发条件:dead记录数

不执行

60

执行

触发条件:dead记录数 + 一小时一次

不执行

执行

触发条件:dead记录数 + 一小时一次

不执行

100

0

执行

触发条件:dead记录数

执行

触发条件:dead记录数

执行

触发条件:dead记录数

不执行

60

执行

触发条件:dead记录数 + 一小时一次

执行

触发条件:dead记录数  + 一小时一次

执行

触发条件:dead记录数 + 一小时一次

不执行


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。