是否需要定时对常用的表做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;
更多语法参见。
- 如果执行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释放空间。具体区别见下表:
差异项 |
VACUUM |
VACUUM FULL |
---|---|---|
空间清理 |
如果删除的记录位于表的末端,其所占用的空间将会被物理释放并归还操作系统。而如果不是末端数据,会将表中或索引中dead tuple(死亡元组)所占用的空间置为可用状态,从而复用这些空间。 |
不论被清理的数据处于何处,这些数据所占用的空间都将被物理释放并归还于操作系统。当再有数据插入后,分配新的磁盘页面使用。 |
锁类型 |
共享锁,可以与其他操作并行。 |
排他锁,执行期间基于该表的操作全部挂起。 |
物理空间 |
不会释放。 |
会释放。 |
事务ID |
不回收。 |
回收。 |
执行开销 |
开销较小,可以定期执行。 |
开销很大,建议确认数据库所占磁盘页面空间接近临界值再执行操作,且最好选择数据量操作较少的时段完成。 |
执行效果 |
执行后基于该表的操作效率有一定提升。 |
执行完后,基于该表的操作效率大大提升。 |