SQL ETL场景下如何处理源表行删除并同步至事实表
事实表ETL同步源端硬删除的可行方案
针对你当前无法用跨库merge、date last modified 字段无法覆盖硬删除场景的问题,可根据技术栈权限和数据规模选择以下三种方案:
方案1:源端新增删除日志表(性能最优)
- 在OLTP源库为待同步的表新增轻量删除触发器,触发条件为行删除动作
- 触发器仅写入专用的删除日志小表,字段仅包含待同步表主键、删除时间即可
- ETL流程新增步骤:每次同步时先拉取上一次ETL运行后新增的删除日志记录,直接批量删除事实表中对应主键的行,再执行原有增量更新逻辑
该方案对源库产生的额外负载极低,仅在删除动作发生时写入极小的单行记录,不需要全表扫描或跨库大数据量传输。
方案2:全量拉取源表主键对比(无需改源库)
- 新增临时staging表仅存储源表当前全量主键字段
- ETL流程新增步骤:每次同步时仅拉取源表所有主键写入该临时表,和事实表现有主键做左关联匹配,筛选出事实表存在、源主键表不存在的记录主键,批量删除
该方案不需要修改源库逻辑,仅拉取主键字段的数据量远小于拉取全表数据,适合单表数据量在千万级以下的场景。
方案3:分区重刷(适合时序类事实表)
- 如果你的事实表按时间字段做了分区,且源端删除仅会发生在最近N个时间周期内(比如近7天、近30天)
- ETL流程新增步骤:每次同步时全量拉取源表最近N个周期的全量数据,直接覆盖事实表对应分区的所有数据,旧分区无需改动
该方案不需要额外处理删除逻辑,同时可以兜底覆盖漏更的增量数据,适合日志、交易类时序事实表场景。
通用注意事项
- 所有删除操作执行前,建议先将要删除的主键写入归档备份表,避免误删后可快速回滚
- 优先使用批量
DELETE按主键匹配的方式执行删除,不要逐行操作降低性能 - 若事实表存在关联其他表的外键约束,需提前确认删除顺序或配置级联删除规则
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

