文档首页/ 数据仓库服务 GaussDB(DWS)/ 常见问题/ 产品咨询/ GaussDB(DWS)的脏页是如何产生的?
更新时间:2024-09-23 GMT+08:00
分享

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。

相关文档