PG

PG内核数据库临时表数据量过大影响执行计划的问题优化 2021.12.09

已邀请:

背景:某项目反馈部分模块节点参照极慢,耗时超过30秒。但并非所有节点都异常。

分析:基于项目反馈,排查分析业务操作录制SPR发现,为特定的2个模块的物料参考慢,普遍耗时超过30秒,SPR日志如下:

http://nccloud.yytimes.com/uploads/answer/20211209/d26c3a699593841479de0f0da9880079.png

http://nccloud.yytimes.com/uploads/answer/20211209/0ca6ae573f87c15967344d075e47abff.png


根据日志记录,显示为 读取结果集时间 比较久, 但从业务整体运行正常,其他业务响应正常的背景来看,出现网络问题的几率极低。结合DBA及性能优化专家的建议,将涉及的SQL通过创建事务模拟了临时表创建、数据插入、及查询过程。 发现最后的查询操作耗时大约30秒。


协同数据库方面的工程师分析执行计划explain analyse SQL,根据计划初步反馈 “最外面 1w * 5k 数据做join,数据量很大”

http://nccloud.yytimes.com/uploads/answer/20211209/d14f79ac45d5f14ae7609ca98a47de8a.png


根据分析情况,调整参数,在事务中 set enable_nestloop = off; 二次执行,耗时为大约30ms

http://nccloud.yytimes.com/uploads/answer/20211209/2c4a66e4113d4b5ceac4e05f6a6ee7d0.png


基于此得出初步的结论,可以通过hint等选择合适的表join方法。如设置 set enable_nestloop = off; 但基于实际的执行计划发现,似乎临时表中的近  1   万条记录没有正确的被分析到。故在临时表创建后进行 analyze bd_materialstock_temp ;之后在进行 set enable_nestloop = on;启用默认的场景,发现执行计划已经默认走到正常最优方案

http://nccloud.yytimes.com/uploads/answer/20211209/819b96c8d598aaffc0b994e405884129.png


故,借此初步得出结论:由于临时表内数据较大,且没有准确的统计信息,导致没有正确的选择join方法,建议在创建临时表后进行统计信息的收集,从而实现准确的执行计划选择。 

要回复问题请先登录注册