唯一性校验查什么
唯一性校验确认业务键在目标粒度上不重复:按主键分组计数,大于 1 就说明存在重复。重复的来源主要有三类——上游任务重跑叠加(用追加写而不是覆盖写)、关联放大(一对多 join 把行数放大)、去重键选错(漏掉明细序号这类细分字段)。所以发现重复时先定位来源,才能保证明天不会再犯。
基本信息
| 检测方法 | 业务键 GROUP BY 加 HAVING COUNT(1) > 1 |
|---|---|
| 常见粒度 | 订单号、订单号加明细序号、日期加实体 |
| 输出内容 | 重复组数与多出来的行数 |
| 处置思路 | 定位上游是重复写入、关联放大还是源端重复 |
典型使用场景
- 明细层主键校验:订单号加明细序号应当唯一
- 汇总层校验:日期加维度组合应当唯一
- 同步链路核对:目标表有没有因重复消费产生双份数据
- 上游重跑后复核:确认覆盖写生效、没有叠加
- 物化视图与缓存表:确认刷新逻辑不会累积历史行
重复检测
重复检测
SELECT order_id, item_no, COUNT(1) AS c
FROM dwd_trade_order_detail_di
WHERE dt = '2026-10-11'
GROUP BY order_id, item_no
HAVING COUNT(1) > 1
ORDER BY c DESC
LIMIT 20;重复总量统计
重复总量统计
SELECT COUNT(1) AS dup_groups, SUM(c - 1) AS extra_rows
FROM (
SELECT order_id, item_no, COUNT(1) AS c
FROM dwd_trade_order_detail_di WHERE dt='2026-10-11'
GROUP BY order_id, item_no HAVING COUNT(1) > 1
) t;重复来源与特征
| 来源 | 特征 | 解法 |
|---|---|---|
| 上游重跑追加 | 重跑当天的行数翻倍 | 改成分区覆盖写入 |
| 关联放大 | 行数与被关联表的重复数成比例 | 先聚合再关联,或改用唯一键 |
| 重复消费 | 同一批次被处理两次 | 消费端幂等,并校验位移回退 |
| 源端重复 | 源系统本身产生两笔 | 确认业务合理性,必要时按规则合并 |
发现重复先别急着去重:掩盖掉重复却不去定位来源,明天还会重现,而且问题会从「能看见」变成「看不见」。
去重键要与粒度对齐:明细表漏掉明细序号会把正常的多行明细判成重复;反过来把明细序号也当主键去重,又会掩盖真正的重复订单。
唯一性规则要按表的粒度分别配置,而不是全库一个模板:明细表、汇总表、快照表的主键组合本来就不同,用同一套规则会在某些表上永远误报。规则清单建议随建表一起提交评审,避免上线后才发现口径对不上。