GaussDB(DWS)的脏页是如何产生的?
产生原因
GaussDB(DWS)采用多版本控制技术(Multi-Version Concurrency Control,简称MVCC)的并发控制机制保证多个事务访问数据库时的一致性和并发性,其优点是读写互不阻塞,缺点则是会造成磁盘膨胀的问题,而MVCC机制是产生脏页的主要原因。
具体表现为如下场景:
- 当对表执行delete操作时,删除的数据只是在逻辑上被标记为已删除,并未真正从磁盘页面中移除。
- 当对表执行update操作时,GaussDB(DWS)将待更新的原数据进行逻辑上的删除标记,同时插入新数据。
对于表中的delete、update操作,被标记为已删除的数据在数据库内部统称为废弃元组,废弃元组在整张表中的占比即为脏页率。因此当表的脏页率高时,则认为表内部被标记为已删除的数据占比高。
处理方案
针对表的脏页率过高的问题,GaussDB(DWS)提供了查询脏页率的系统视图,具体使用请参见PGXC_STAT_TABLE_DIRTY。
为了解决脏页率高导致磁盘空间膨胀的问题,GaussDB(DWS)提供了VACUUM的功能,可以有效清理delete、update操作后标记的已删除数据,具体请参见VACUUM。
VACUUM不会释放已经分配好的空间,如果要彻底回收已删除的空间,则需要使用VACUUM FULL。
- VACUUM FULL可以清理并释放已删除数据的空间,进而提高数据库的性能和效率。但是执行VACUUM FULL命令更加耗费时间和资源,并且可能会导致一些表被锁定,因此VACUUM FULL命令需要在数据库负载较低的情况下使用。
- 为降低磁盘膨胀对数据库性能的影响,建议对查询脏页率超过80%的非系统表执行VACUUM FULL,用户也可根据业务场景自行选择是否执行VACUUM FULL。