拉链合并的执行顺序
拉链合并的典型流程固定为六步:取源增量、计算 hashdiff、与当前版本对比、关闭发生变更的旧行、插入新行、做质量校验。整个过程建议放在单事务里,保证读写一致,避免下游在中间态读到既无旧版本也无新版本的成员。合并逻辑必须幂等:同一批数据重跑两次,版本行数与内容都不应变化,这是判断实现是否可靠最直接的检验方式。
基本信息
| 执行顺序 | 先关闭旧版本,再插入新版本,顺序不可颠倒 |
|---|---|
| 事务要求 | 单事务执行,避免中间态被下游读到 |
| 幂等检验 | 同批数据连跑两次,版本行数不变 |
| 前置去重 | 源增量先按自然键去重,同批只保留最新一次变更 |
| 质量校验 | 当前版本唯一、区间不重叠、无断档 |
典型使用场景
- 每日维表增量:按批次合并变更,兼顾准实时与历史完整
- 任务失败重跑:幂等设计让重跑不必人工清理中间结果
- 多源变更合并:两个系统同时改同一成员时,按变更时间排序取最新
- 历史修复:定位到错误版本后按区间回补,而不是整表重建
- 上线演练:用同批数据连跑两次验证幂等,作为验收的必要步骤
合并流程要点
合并流程要点
1) 源数据先按自然键去重:同批多次变更只取变更时间最新的一条 # 防一次插多版本
2) 计算 hashdiff:属性集合固定,不含入库时间等易变字段 # 防无变更也插行
3) 与当前版本比对:hashdiff 相同则跳过,不同才进入关闭与插入 # 减少无意义版本
4) 关闭旧行:条件带 is_current = 1 并且 hashdiff <> 新值 # 防误关未变更成员
5) 插入新行:start_date 取变更生效时间,end_date 取远期极大值 # 区间连续
6) 质量校验:当前版本唯一、同键区间不重叠、不出现断档 # 校验不通过即告警重跑与幂等
| 场景 | 是否幂等 | 处理方式 |
|---|---|---|
| 按批次号覆盖写入 | 幂等 | 重跑覆盖同批次结果,无需人工干预 |
| 先删本批再插入 | 幂等 | 删除条件必须精确到批次与自然键 |
| 直接追加插入 | 不幂等 | 重跑产生重复版本,需人工清理 |
| 全表重建 | 幂等但代价高 | 历史区间易断裂,需重新计算有效期 |
幂等检验的方法很简单:拿同一批数据连跑两次,比较版本行数与当前版本数量。数字不变说明实现可用;数字翻倍说明合并前缺少去重或关闭条件。
用 delete 加 insert 全表重建维表看似简单,但历史区间会被重新计算,已发出的报表口径随之变化,跨期对比立刻失真。