如何在Oracle Data Integrator(ODI)中删除目标表不需要的记录
无需截断目标表同步删除冗余记录的可行方案
方案1:启用IKM内置删除配置
大部分版本的IKM Oracle Incremental Update自带缺失行删除能力,无需自定义逻辑:
- 打开对应Mapping的IKM属性配置面板
- 将
DELETE_MISSING_ROWS选项设置为是 - 确认配置的目标表更新唯一键和源表的匹配逻辑正确
执行原理是IKM完成增量插入、更新操作后,会自动生成匹配删除语句,删除目标表中唯一键不在当前源表数据集内的记录,全程不需要截断目标表,性能和常规增量更新一致。
方案2:添加自定义后处理删除步骤
如果使用的旧版IKM没有内置删除选项,可以在Mapping执行流程的最后新增一个JDBC步骤,执行以下删除逻辑:
DELETE FROM 目标表 t WHERE NOT EXISTS ( SELECT 1 FROM 源表 s WHERE t.唯一键字段1 = s.唯一键字段1 -- 按实际业务的更新唯一键补全所有匹配条件 );
- 可配置事务控制,确保删除操作和前面的插入、更新操作同事务提交,避免数据不一致
- 数据量较大时,提前给两边的唯一键字段创建索引,可大幅提升删除操作的性能
方案3:配合CDC捕获删除事件
如果源表已经开启Oracle CDC或ODI Journalizing日志功能,优先采用增量捕获删除事件的方案:
- 在Mapping中过滤出操作类型为
D(删除)的CDC变更记录 - 新增独立处理分支,匹配目标表唯一键执行对应删除操作
该方案不需要扫描全量源表,仅处理增量删除事件,适合数据量极大、全量匹配性能不足的场景。
注意事项
- 所有方案都依赖源表和目标表匹配的唯一更新键,需确保更新键无空值、无重复,避免出现误删
- 正式环境执行前,可先把DELETE语句改为SELECT COUNT(*)语句验证待删除行数是否符合预期,规避操作风险
内容的提问来源于stack exchange,提问作者ZEESHAN
相关产品推荐
相关产品推荐

