Informatica不使用SCD及更新策略实现记录删改方案咨询
Informatica 无SCD、无Update Strategy组件实现记录删更方案
核心实现思路
完全基于临时表落地+数据库原生集合运算实现,映射层仅保留最基础的Flat File源抽取、直写临时表逻辑,所有更新、删除逻辑下沉到目标数据库执行,无需依赖Informatica平台的特殊Slowly Changing Dimension、Update Strategy组件。
具体实现步骤
- 前置准备:在目标数据库创建与正式目标表结构完全一致的临时staging表
tmp_loc_flat_load,字段包含业务主键、location字段及其余所有业务字段,每次批任务启动前先执行TRUNCATE TABLE tmp_loc_flat_load清空上一批次残留数据。 - 映射配置:仅配置最基础的抽取链路:Flat File Source -> Source Qualifier -> 临时表目标,全程不添加任何更新策略、SCD相关转换,写入模式选普通Insert即可,把Flat File里的全量最新数据完整写入临时表。
- 批任务后置SQL执行:在工作流的临时表写入节点后,增加SQL执行节点,按顺序执行两段SQL,完成目标表的同步:
- 以「业务主键+location」为匹配键,把临时表的数据Merge到正式目标表:匹配到相同主键+location的记录时,更新其余变动的业务字段;匹配不到时直接插入新记录,覆盖新数据写入、存量非location字段更新的场景。
- 执行清理逻辑:删除正式目标表中「主键+location」组合在当前临时表中不存在的记录,这一步会自动清理location变更后残留的旧记录,不会误删本来就存在的同location有效记录。
参考SQL(兼容Oracle、PostgreSQL、MySQL 8.0+版本)
-- 1. 写入/更新有效记录 MERGE INTO target_location_table tgt USING tmp_loc_flat_load stg ON (tgt.biz_id = stg.biz_id AND tgt.location = stg.location) WHEN MATCHED THEN UPDATE SET tgt.biz_col1 = stg.biz_col1, tgt.biz_col2 = stg.biz_col2, tgt.update_time = CURRENT_TIMESTAMP WHEN NOT MATCHED THEN INSERT (biz_id, location, biz_col1, biz_col2, create_time, update_time) VALUES (stg.biz_id, stg.location, stg.biz_col1, stg.biz_col2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); -- 2. 清理location变更产生的旧残留记录 DELETE FROM target_location_table tgt WHERE NOT EXISTS ( SELECT 1 FROM tmp_loc_flat_load stg WHERE tgt.biz_id = stg.biz_id AND tgt.location = stg.location );
优化提示:如果单批次数据量超过10万,可以给临时表的
biz_id、location字段建联合索引,能把Merge和Delete的执行效率提升5~10倍。该逻辑完全支持三个地点间的任意双向变更,比如原Bangalore的记录改Chennai、原Chennai改Ahmedabad这类场景,都不会出现错删、漏更的问题,和示例场景的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Viranna Gadgoli
相关产品推荐
相关产品推荐

