当对数据库执行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来回收空间。