问题描述
数据库整体查询慢,之前查询需要2-3分钟完成,现在需要6-7分钟
处理过程
由于数据库整体慢一般是数据库的表脏页率高,使用Select * from pgxc_get_stat_dirty_tables(0,0);查询数据库的表脏数据,发现这个数据库的系统表和一些大表的脏数据很多(如下图),需要先清理,一般清理后数据库的性能会恢复正常,还有单点性能问题需要具体问题具体分析

根因
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
解决方案
清理系统表
https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=150164
普通表清理
需要在这个表没有业务的时候执行
VACUUM FULL ANALYZE tablename;
后续813版本及以上版本是建议开启autovauum的功能,虽然不能彻底回收已删除的空间,但是可以整理和利用被标识为删除状态的记录空间,并更新表的统计数据
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/316337.html