文档首页/ 数据仓库服务 GaussDB(DWS)/ 常见问题/ 数据库使用/ GaussDB(DWS)是否需要定时对常用的表做VACUUM FULL和ANALYZE操作?
更新时间:2024-10-08 GMT+08:00

GaussDB(DWS)是否需要定时对常用的表做VACUUM FULL和ANALYZE操作?

需要。

对于频繁增、删、改的表,需要定期执行VACUUM FULL和ANALYZE,该操作可回收已更新或已删除的数据所占据的磁盘空间,防止因数据膨胀和统计信息不准造成性能下降。

  • 一般情况下,对表执行完大量增、改操作后,建议进行ANALYZE。
  • 对表执行过删除操作后,建议进行VACUUM,一般不建议日常使用VACUUM FULL选项,但是可以在特殊情况下使用。例如,用户删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。VACUUM和VACUUM FULL具体的差异可以参考VACUUM和VACUUM FULL

语法格式

指定某张表进行分析。

ANALYZE table_name;

对数据库中的所有表(非外部表)进行分析。

ANALYZE;

指定某张表进行VACUUM。

VACUUM table_name;

指定某张表进行VACUUM FULL。

VACUUM FULL table_name;

更多语法参见VACUUMANALYZE | ANALYSE

  • 如果执行VACUUM FULL命令后所占用物理空间无变化(未减少),请确认是否有其他活跃事务(删除数据事务开始之前开始的事务,并在VACUUM FULL执行前未结束)存在,如果有,需等其他活跃事务退出后进行重试。
  • 8.1.3及以上版本中Vacuum/Vacuum Full可在管控面操作调用,详情可参见智能运维

VACUUM和VACUUM FULL

在GaussDB(DWS)中,VACUUM的本质就是一个“吸尘器”,用于吸收“尘埃”。而尘埃其实就是旧数据,如果这些数据没有及时清理,那么将会导致数据库空间膨胀,性能下降,更严重的情况会导致异常退出。

VACUUM的作用:

  • 空间膨胀问题:清除废旧元组以及相应的索引。包括提交的事务delete的元组(以及索引)、update的旧版本(以及索引),回滚的事务insert的元组(以及索引)、update的新版本(以及索引)、copy导入的元组(以及索引)。
  • FREEZE:防止因事务ID回卷问题(Transaction ID wraparound)而导致的异常退出,将小于OldestXmin的事务号转化为freeze xid,更新表的relfrozenxid,更新库的relfrozenxid、truncate clog。
  • 更新统计信息:VACUUM ANALYZE时,会更新统计信息,使得优化器能够选择更好的方案执行SQL语句。

VACUUM命令存在两种形式,VACUUM和VACUUM FULL,目前VACUUM对行存表有作用,对列存表无显著的作用,列存表只能依靠VACUUM FULL释放空间。具体区别见下表:

表1 VACUUM和VACUUM FULL

差异项

VACUUM

VACUUM FULL

空间清理

如果删除的记录位于表的末端,其所占用的空间将会被物理释放并归还操作系统。而如果不是末端数据,会将表中或索引中dead tuple(死亡元组)所占用的空间置为可用状态,从而复用这些空间。

不论被清理的数据处于何处,这些数据所占用的空间都将被物理释放并归还于操作系统。当再有数据插入后,分配新的磁盘页面使用。

锁类型

共享锁,可以与其他操作并行。

排他锁,执行期间基于该表的操作全部挂起。

物理空间

不会释放。

会释放。

事务ID

不回收。

回收。

执行开销

开销较小,可以定期执行。

开销很大,建议确认数据库所占磁盘页面空间接近临界值再执行操作,且最好选择数据量操作较少的时段完成。

执行效果

执行后基于该表的操作效率有一定提升。

执行完后,基于该表的操作效率大大提升。