GaussDB(DWS)列存(auto)vacuum特性整理(一)——小CU&0CU合并解决
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:频繁upsert、update、delete等更新后,6W的CU其中大部分甚至全部数据被标记删除,这样的CU虽然空间上会被列存vacuum通过填充NULL进行回收,但是依然会导致小IO和cudesc表的膨胀,进而影响性能
使用方法及约束
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手动触发合并小(0)CU
- 第一个参数传表名,第二个参数是可选参数,传入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_limit(min) |
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记录数 + 一小时一次 |
不执行 |
- 点赞
- 收藏
- 关注作者
评论(0)