赞
踩
公司的产品之前是用的mysql,然后由于现在很多客户要求国产化,所以将产品从centOs+mysql调整为了Euler+opengauss,这里记录一个遇到的问题
系统跑了一段时间后,发现有一张表,单表查询特别缓慢,总数据量5万左右,select Count(*)时间能达到10秒以上,排查问题开始
首先怀疑是由于dead tuples过多导致的表卡顿(一张5w数据的表空间占用9个G)
参考文章
POstgreSql清理死亡元组
执行VACUUM清理后,空间占用降低,表查询速度快了,但是只维持了很短时间,很快就继续卡,所以接下来就继续分析。
通过pg_stat_user_tables表查询,发现n_tup_upd (表总更新行数)达到1亿多次(仅仅跑了半个月),马上去查看pg_log日志,发现该表有一直执行更新语句,一小时200-300次,在我们系统方面来说,这是一个正常的数据。
最后定位到原因,执行的更新语句格式如下:
update xxxx set status = 0 where parent_id = '' and id <> '' ;
这里有一个很关键的点,在mysql中,执行的语句会被自动替换为
update xxxx set status = 0 where parent_id = '' and id <> '' and status<>0;
但是opengauss中没有这个补全(按照标准sql没毛病),所以导致每次执行,会满足条件的整个更新,一次更新一千条左右,导致该表更新次数极高,手动将代码中sql补全后,问题解决,查询正常
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。