自动回收空间(Auto Vacuum)

云原生数据仓库AnalyticDB PostgreSQL版能够在后台对表自动进行脏数据回收操作,避免数据持续膨胀导致扫描性能下降以及XID回卷问题,本文介绍Auto Vacuum工作机制及调优参数。

前提条件

云原生数据仓库AnalyticDB PostgreSQL版实例的版本为2021年05月27日及以上。如何升级小版本,请参见版本升级

工作机制

Auto Vacuum可以自动执行VACUUM或者VACUUM FREEZE命令。Auto Vacuum进程会定期检查具有大量插入、更新或删除的表,以及每张表的XID AGE,在需要的时候主动对表执行VACUUM或VACUUM FREEZE操作,回收表中的垃圾数据或者降低XID AGE,提升查询速度。

触发公式

脏数据行数 > 表行数 * 触发比例阈值 + 触发行数阈值

脏数据在表进行更新删除时会累计,表行数为该表上次进行分析时得到的行数统计信息,触发比例阈值受autovacuum_vacuum_scale_factor参数控制,默认为0.5,触发行数阈值受autovacuum_vacuum_threshold参数控制,默认为10000行。即默认情况下您可以认为:当表中脏数据比例超过一半时,自动脏数据清理会触发。

锁冲突

Auto Vacuum会持有表的四级锁。当Auto Vacuum工作期间,如果业务需要持有的锁与Auto Vacuum获取的锁冲突,Auto Vacuum进程会主动退让锁,不影响业务执行。

资源占用

Auto Vacuum在执行时会占用一定CPU和IO资源,但在业务没有触及资源瓶颈时不会对性能有影响。

查询Auto Vacuum进程工作情况

AnalyticDB PostgreSQL 7.0版中,可以通过如下的SQL查看正在工作的Auto Vacuum进程。

SELECT * FROM pg_stat_activity WHERE backend_type = 'autovacuum worker';

AnalyticDB PostgreSQL 6.0版中,可以通过如下的SQL查看正在工作的Auto Vacuum进程。

SELECT * FROM pg_stat_activity WHERE query LIKE 'autovacuum%';

查询Auto Vacuum执行VACUUM的表

SELECT schemaname, c.relname, c.reltuples, n_dead_tup, last_autovacuum, (n_dead_tup::float / c.reltuples::float) 
AS bloat_ratio FROM pg_stat_all_tables s, pg_class c 
WHERE c.oid = s.relid AND c.reltuples > 10000  AND (n_dead_tup::float >  10000 + c.reltuples::float * 0.5) 
ORDER BY (n_dead_tup::float/ c.reltuples::float) DESC;

参数说明:

  • 0.5:实例autovacuum_vacuum_scale_factor的参数值。

  • 10000:实例autovacuum_vacuum_threshold的参数值。

参数设置

实例级别参数

如下所示为支持调整的实例级别参数。

参数名称

参数含义

默认值

autovacuum_naptime

auto vacuum进程调度周期,单位为秒。

60

autovacuum_vacuum_scale_factor

auto vacuum触发的比例阈值。若您希望回收脏数据的频率更高,可以通过调低比例阈值实现。

0.5

autovacuum_vacuum_threshold

auto vacuum触发的行数阈值。

10000

autovacuum_freeze_max_age

auto vacuum触发VACUUM FREEZE的XID AGE阈值。

200,000,000

autovacuum_max_execute_workers

auto vacuum允许执行的并行数。

max(3, cpucores/2),

cpucores为单计算节点CPU核数。

重要

一般不建议调整实例级别的Auto Vacuum参数,如果想要调整某个参数阈值,可以提交工单联系工程师调整。

表级别参数

调整Auto Vacuum参数

您可以只针对某张表调整Auto Vacuum参数,语法如下。

ALTER TABLE <test_table> SET (<autovaccum_options>=<expect_value>);

参数说明:

  • <test_table>:需要调整的表名。

  • <autovaccum_options>:可以调整的Auto Vacuum表级别参数。

  • <expect_value>:想要调整的值。

使用示例

示例一:关闭表test的Auto Vacuum。

ALTER TABLE test SET (autovacuum_enabled=false);
重要

autovacuum_enabled=false会关闭表的Auto Analyze能力,建议通过调高触发比例关闭Auto Vacuum。

示例二:调高表test Auto Vacuum的触发比例到80%。

ALTER TABLE test SET (autovacuum_vacuum_scale_factor=0.8);

还原Auto Vacuum参数

您也可以还原某张表的Auto Vacuum参数为实例默认值,语法如下。

ALTER TABLE <test_table> RESET (<autovaccum_options>);

使用示例

示例一:还原表test Auto Vacuum的触发比例为默认值。

ALTER TABLE test RESET (autovacuum_vacuum_scale_factor);

支持调整的表级别参数

参数名称

参数含义

autovacuum_vacuum_scale_factor

auto vacuum触发的比例阈值。

autovacuum_vacuum_threshold

auto vacuum触发的行数阈值。