文档

空间回收

更新时间:

当对数据库执行UPDATE或DELETE操作时,虽然数据表面上已被删除,但实际上只是被标记为不可见,并留有"空洞"在数据页中。这会导致在读取数据时,这些"空洞"也会一同被加载,从而减慢了数据的扫描速度。因此,您需要定期清理这些已删除的空间以提高数据读取效率。

  • AnalyticDB PostgreSQL能够在后台自动对表进行脏数据回收操作(Auto Vacuum)。具体操作,请参见自动回收空间(Auto Vacuum)

  • 为了在大量的删除或更新操作后及时清理表,您也可以针对整个AnalyticDB PostgreSQL数据库或单个表手动执行VACUUM 操作。具体操作,请参见维护定期回收空间任务

空间回收方法

使用VACUUM命令,可以对表进行重新整理,回收空间,以便获取更好的数据读取性能。VACUUM命令如下:

VACUUM [FULL] [FREEZE] [VERBOSE] [table];
  • VACUUM:不带任何参数时,会对所有表执行VACUUM操作。

  • VACUUM [table]:对单表执行VACUUM,清理脏数据,释放列存表的脏数据空间和行存表尾部的空洞,该操作不会阻塞该表的读写。

  • VACUUM FULL [table]:对单表执行VACUUM FULL,会彻底释放表的脏数据空间,但是会请求排他锁阻塞读写。

  • VACUUM FREEZE [table]:对单表执行VACUUM FREEZE,降低单表的XID AGE,不阻塞读写。

  • VACUUM VERBOSE [table]:会打印VACUUM执行过程中各节点回收脏数据行数的日志。

使用建议

  • AnalyticDB PostgreSQL实例默认开启Auto Vacuum功能,后台自动对表进行脏数据回收操作和降低XID AGE。

  • 在进行大量删除与更新操作后,您可以手动执行运行VACUUM FULL命令,以彻底地释放表占用空间。

  • 只有表的主用户才能执行VACUUM操作。如果在没有相应权限的情况下运行VACUUM,该操作不会产生任何效果。

查询需要执行VACUUM的表

AnalyticDB PostgreSQL提供了智能诊断数据膨胀功能,您可以利用该能力找到膨胀的表,按照建议查询需要执行VACUUM的表。具体内容,请参见数据膨胀诊断

AnalyticDB PostgreSQL提供了一个gp_bloat_diag视图,统计当前页数和实际需要页数的比例。您也可以通过analyze table来收集统计信息之后,查看该视图。

gpadmin=# SELECT * FROM gp_toolkit.gp_bloat_diag;
bdirelid | bdinspname | bdirelname | bdirelpages | bdiexppages |                bdidiag                
----------+------------+------------+-------------+-------------+---------------------------------------
    21488 | public     | t1         |          97 |           1 | significant amount of bloat suspected
(1 row)

结果只包括发生了中度或者显著膨胀的表。当实际页面和预期页面的比率(bdirelpages / bdiexppages)超过4但小于10时,就会报告为中度膨胀。当该比率超过10时就会报告显著膨胀。对于这些表,可以执行VACUUM FULL来回收空间。