ODS删除记录时设置DWH对应记录EndDate为GetDate()的重复更新问题
解决ETL包重复更新DWH失效记录的问题
问题出在哪
你现在的条件拆分逻辑只盯着「DWH有这条记录但ODS里没了」,却没检查这条DWH记录是不是已经被标记失效了——也就是它的BI_EndDate还是不是默认的9999-12-31。所以哪怕FR记录已经被更新过一次,每次跑ETL的时候它还是会满足!ISNULL(EmployeeIdDWH) && ISNULL(CountryIdODS)的条件,导致重复执行更新。
怎么改
1. 调整条件拆分的判断逻辑
在原有条件的基础上,加上对BI_EndDate的检查,只让**还处于有效状态(未失效)**的记录进入更新分支。最终的条件应该是:
!ISNULL(EmployeeIdDWH) && ISNULL(CountryIdODS) && BI_EndDateDWH == '9999-12-31'
(注意字段名要和你数据流里的实际别名对应,比如如果DWH的BI_EndDate在数据流里叫BI_EndDateDWH就用这个,根据实际情况调整)
2. 给UPDATE语句加双重保险(可选但推荐)
哪怕数据流里的判断漏了,也可以在数据库层面再加一层限制,确保只有未失效的记录才会被更新:
UPDATE [DWH].[BridgeNationality] SET [BI_EndDate] = GETDATE() WHERE [EmployeeId] = ? AND CountryId = ? AND BI_EndDate = '9999-12-31'
为什么这样管用
- 第一次跑ETL的时候,FR记录的
BI_EndDate还是9999-12-31,满足所有条件,会被更新成当前日期。 - 之后再跑ETL,这条FR记录的
BI_EndDate已经不是默认值了,就不会再触发更新操作了。
要是你的DWH表数据量不小,还可以给EmployeeId、CountryId和BI_EndDate建个复合索引,能提升ETL查询和更新的速度。
内容的提问来源于stack exchange,提问作者mohamed-mhiri
相关产品推荐
相关产品推荐

