postgresql/openGauss单表查询缓慢

        公司的产品之前是用的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补全后,问题解决,查询正常

你可能感兴趣的:(mysql,数据库,java,postgresql)