perf(finance): 消除定时同步与后台页面的重查询

- 新增 order_items.manual_sku_key 生成列(迁移 106),统一内部 SKU 口径(skuNick → outSkuSn → sku_code → sku_name,去空格)
- 人工渠道匹配 8.4s → 62ms;人工商品归一写回 7.0s → 307ms
- 销售事实重算改为物化订单集合 + 预聚合成本/退款,6.9s → 0.5s 内
- 成本异常写入去掉逐项 LATERAL 工单探测,收口按最近 7 天窗口,7–8s → 0.5s 内
- 销售毛利订单统计去掉重复 NOT EXISTS,9.4s → 0.4s
- 接单平台店铺下拉改 EXISTS 半连接,3.1s → 0.3s
- cost-finance-sync 默认间隔 5 分钟 → 15 分钟;完整同步 51.2s → 34.9s
This commit is contained in:
yml2213
2026-10-28 13:41:11 +08:00
parent 08318ef8d9
commit 915ce017f3
8 changed files with 145 additions and 82 deletions
@@ -0,0 +1,31 @@
-- 106_manual_sku_key.sql
--
-- 内部 SKU 匹配键:skuNick -> outSkuSn -> sku_code -> sku_name(全部去空格)。
--
-- 背景:人工商品归一、人工渠道匹配每次定时同步都要从 spec_json 现算这个键,
-- 41 万单 / 12 万人工项实测单条 SQL 3–7 秒,且两种写法(3 级 / 4 级、带不带
-- TRIM)不一致。固化成生成列后,查询直接走索引,也保证所有入口口径一致。
--
-- 注意:ADD COLUMN ... GENERATED ... STORED 会重写 order_items(41 万行约
-- 1–2 分钟,期间持 ACCESS EXCLUSIVE 锁),应放在维护窗口执行。
ALTER TABLE order_items
ADD COLUMN IF NOT EXISTS manual_sku_key TEXT
GENERATED ALWAYS AS (
COALESCE(
NULLIF(BTRIM(spec_json->>'skuNick'), ''),
NULLIF(BTRIM(spec_json->>'outSkuSn'), ''),
NULLIF(BTRIM(sku_code), ''),
NULLIF(BTRIM(sku_name), '')
)
) STORED;
COMMENT ON COLUMN order_items.manual_sku_key IS
'内部 SKU 匹配键(去空格):skuNick -> outSkuSn -> sku_code -> sku_name;人工履约配置按它匹配';
CREATE INDEX IF NOT EXISTS idx_order_items_manual_sku_key_stored
ON order_items (manual_sku_key)
WHERE fulfillment_mode = 'manual' AND manual_sku_key IS NOT NULL;
-- 旧索引表达式少了 TRIM,和任何查询都对不上,属于纯写入开销。
DROP INDEX IF EXISTS idx_order_items_manual_sku_key;