# 性能与扩展性评估补充(模具订单/采购主线) ## 1. 高并发冲突面与加固点 ### 1.1 新增/修改模具订单的锁冲突来源 - 冲突对象:同一仓库同一物料的 `inventory` 行。 - 冲突操作:创建订单自动扣料、按单领料、修改订单回补再扣减。 ### 1.2 已落地的并发加固 - 对库存扣减采用原子更新(`UPDATE ... SET quantity = quantity - :qty WHERE quantity >= :qty RETURNING quantity`),避免“读-改-写”丢失更新与超卖。 ## 2. 慢 SQL 发现与清单产出方法 ### 2.1 生产环境抓取 - 启用 `pg_stat_statements` 并定期采样均值/最大耗时 TopN。 - 参考脚本:`scripts/db/030_pg_stat_statements.sql`。 ### 2.2 代码层高风险查询点(需要重点盯) - 订单列表/详情:按 `customer_id/status/order_date` 过滤 + 明细表 join。 - 库存流水:按 `warehouse_id/created_at` 分页、按 `reference_type/reference_id` 追溯。 - 物料需求计算:必须避免 N+1(已将 BOM 查询批量化)。 ## 3. 索引与查询重写(可执行脚本) - `scripts/db/002_indexes_and_constraints.sql` 覆盖: - 订单头状态/客户组合索引 - 明细表 `order_id/product_id` 索引 - 流水 `warehouse_id+created_at`、`reference_type+reference_id` 索引 - 库存唯一约束与关键 check 约束 ## 4. 千万级订单量扩展路线 ### 4.1 优先方案:PostgreSQL 分区 - 表:`sales_orders`、`purchase_orders` 按 `order_date` 月分区。 - 参考模板:`scripts/db/010_partitioning_template.sql`。 ### 4.2 分库分表(必要时) - 拆分键:`org_id`(库路由)+ `order_date`(表分区)。 - 灰度步骤:双写→读切换→写切换→数据校验→下线旧库。 ## 5. 缓存建议(可选) - 读多写少:产品/BOM/供应商/客户可使用本地缓存(Caffeine 类似策略在 Python 可用 LRU/TTL)或 Redis。 - 幂等:新增订单建议引入 `idempotency_key`(请求头/字段),避免重复提交造成重复扣料与重复下单。