sale.order确认与stock.picking验证操作性能缓慢原因排查求助
针对你遇到的超1万产品、数千联系人规模数据库中,sale.order的action_sale_ok和stock.picking的button_validate按钮点击后卡顿超10秒的问题,结合你已排查过核心模型代码的情况,给你几个精准的排查方向:
开启SQL性能日志定位慢查询
启动Odoo时添加--log-sql=debug参数,或者在系统设置中开启SQL日志记录,重点关注按钮触发后执行的批量关联查询、统计类SQL。比如确认订单后是否有遍历所有关联库存记录的查询,或者验证调拨时是否触发了跨大表的关联统计,这些无索引或未优化的查询是卡顿高发点。追踪状态变更触发的计算字段依赖链
检查sale.order(状态变为sale)和stock.picking(状态变为done)时,哪些compute字段会被自动触发。比如某些自定义的库存可用量统计、客户订单总额计算,若这些计算方法中存在遍历大量记录(比如遍历所有产品库存)的逻辑,会直接拖慢响应速度。排查自动化动作与服务器动作
进入设置-技术-自动化,查看是否有在销售订单确认、调拨单验证时触发的自动化动作或服务器动作。比如自动批量生成发票、同步数据到外部系统、给大量联系人发通知这类动作,一旦处理数据量过大,必然导致卡顿。分析
write方法的重载逻辑
很多自定义模块会重载sale.order和stock.picking的write方法,在状态变更时执行额外逻辑。检查这些重载方法中是否存在循环处理每条关联记录、重复调用耗时接口的情况——比如每次状态变更都遍历所有关联stock.move做批量更新,且没有做批量SQL优化。用调试工具追踪方法耗时
- 前端:开启Chrome开发者工具的Performance面板,录制按钮点击到页面响应的全过程,查看是否有JS层面的阻塞请求,或者后端接口的耗时分布。
- 后端:在可疑的依赖方法(比如状态变更后触发的
post_write钩子、模块的自定义逻辑)前后添加临时计时日志,比如:
精准定位哪一段代码拖慢了整体速度。import time start = time.time() # 可疑方法代码 print(f"方法耗时: {time.time() - start}s")
检查数据库索引完整性
针对product.product、res.partner、stock.move、sale.order这些大表,查看是否缺失关联字段的索引(比如product_id、partner_id、picking_id)。没有索引的大表关联查询,数据量上来后会呈指数级变慢。临时禁用第三方模块测试
如果系统安装了自定义销售/库存模块或第三方插件,先临时禁用这些模块,再测试按钮响应速度。很多卡顿是第三方模块的冗余逻辑或冲突导致的,排除法能快速定位问题来源。
内容的提问来源于stack exchange,提问作者holydragon

