PG数据库死亡元组过多导致查询慢优化方法
发布于 2021-09-22 07:49
集团云改数转战略背景下,随着越来越多的平台系统上云去O,很多系统数据库采用了PG(PostgresSQL)数据库。在使用PG数据库时,会发现有时候查询速度非常慢,以往很快就查询出来的,结果需要数十秒才行,检查发现没有锁,这时候一般都是表的死元组太多导致的。本文通过因为死亡元组过多导致数据库查询响应慢,从而引发IPTV3.0平台C1模板工单下发失败的案例,介绍PG数据库死亡元组清理及业务程序优化的方法。
一、PG数据库死亡元组介绍
PostgreSQL做delete操作时,数据集(也叫做元组、tuples)是没有立即从数据文件中移除的,仅仅是通过在行头部设置xmax做一个删除标记。update操作也是一样的,在postgresql中可以看作是先delete再insert。
这是PostgreSQL MVCC的基本思想之一,因为它允许在不同进程之间只进行最小的锁定就可以实现更大的并发性。这个MVCC实现的缺点是它会留下被标记删除的死亡元组(dead tuples),即使在所有事务完成之后依然存在。
(一)问题描述
1.检查接口机日志发现C1工单任务正常,任务已入库。
2.检查CP日志发现有SQL超时日志。
(三)原因分析
经过进一步排查分析,引发C1接口失败的原因主要有:
1、PG数据库中epgserver表的死亡元组过多(800W+),导致数据库更新操作返回超时。
2、由于epgserver表的死亡元组过多,正常的数据库自动vcauum清理操作速度赶不上死亡元组生成速度,导致死亡元组积压越来越多,最终导致表查询变慢。
1、EPG的状态发生变更,立即更新。
2、EPG的在线用户跨越最大用户数的80%(例如从79%上升到80%以上,或者从80%以上降低到79%),立即更新。
3、EPG的在线用户数大于等于最大用户数的80%并且本次的在线用户数比上次的在线用户数多,立即更新。
4、EPG的本次在线用户数跟上次相比,变化大于最大用户数的30%,立即更新。
图文原创 / 省公司供稿
编辑 /盐城公司运维宣传团队
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材