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:
@@ -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;
|
||||
Reference in New Issue
Block a user