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