yml2213
|
39fe448b48
|
feat(cost-exceptions): 支持 --days=0 一次性归档
一次性清理需要「不按时间过滤」的语义,但 CLI 把 days 下限钳在 1:
本地库的 15.2 万条 resolved 异常是 17 小时前重建生成的,
--days=1 一条都命中不了,只能手写 SQL。
- --days=0 表示不过滤时间,归档全部已处理行(open 仍不归档);
- 执行时打印一次性清理提示,避免日常误用;
- 记录 2026-10-25 的实际清理结果:151,939 行 / 152 批 / 3.9 秒,
热表 260,253 → 108,314(全为 open),VACUUM FULL 后 155 MB → 51 MB,
归档表 61 MB,主键重叠 0 条。
验证:--days=0 --dry-run 返回 retentionDays=0、archivableRows=0(已清空)。
|
2026-10-25 13:34:09 +08:00 |
|
yml2213
|
d90c066888
|
feat(cost-center): 成本异常 60 天归档
cost_exceptions 只增不减:本地快照 260,253 行(resolved 151,939 / open 108,314),
已处理的行只是审计痕迹,留在热表会拖慢「状态 + 时间」分页,并让唯一索引持续膨胀。
- 迁移 108:新增 cost_exceptions_archive(保留原 id 与时间字段,加 archived_at),
热表补部分索引 idx_cost_exceptions_archivable
(COALESCE(resolved_at, created_at)) WHERE status <> 'open',让每日任务不扫全表;
- cost-exception-archive-service:只归档 status <> 'open' 且超期的行,每批 1000 行,
DELETE ... RETURNING + INSERT 在同一语句内完成,单批原子,不存在「删了没归档」;
- data-retention 每日任务接入;保留期走 COST_EXCEPTION_RETENTION_DAYS(默认 60);
- 新增 npm run cost-exceptions:archive(--dry-run / --days / --batch-size)。
为什么 open 行不归档:open 是待办队列,超期不等于已解决,归档等于把问题藏起来。
验证:
- 3 条 resolved 回拨到 90 天前 → 归档 3 条,热表 resolved 151,939 → 151,936;
- 1 条 open 回拨到 90 天前 → 仍在热表,未被归档;
- 归档表保留原 id 与时间,archived_at 记录归档时刻;
- 恢复测试数据后计数回到 151,939 / 108,314。
|
2026-10-25 12:09:20 +08:00 |
|