ole db目标上的重复行



我有一个相当复杂的场景,同一个包可以并行运行。在某些情况下,两个执行最终可能会尝试将同一行插入目标,从而导致违反主键错误。

当前有一个查找,检查目标表以查看记录是否存在,因此插入是在其"no match"输出上完成的。它不能防止错误,因为查找是在包开始时加载的,因此两个包都得到相同的数据,如果有一行进来,它们都会认为它是一个"新"行,所以第一行成功,第二行失败。

有什么办法可以避免这种情况?几乎忽略"重复行"在旧的目的地?我不能使用MAX ERROR COUNT,因为重复的行在第一个包上没有的其他行中,应该插入。

默认的查找行为是采用Full Cache模式。正如您所观察到的,在包验证阶段,它将把所有查找值拉到本地内存缓存中,并使用导致丢失对表更新的值。

对于您的场景,我会尝试将缓存模式更改为None(部分是另一种选择)。None表示应该针对经过的每一行向目标数据库触发实际查询。根据您的数据量或性能不佳的查询,这可能对目标产生不小的影响。它仍然不能保证并行实例没有尝试加载完全相同的记录(或者并行运行已经满足了他们的查找并准备写入目标表),但它应该改善这种情况。

如果你不能控制包的执行,使得并发数据流触发,那么你应该考虑重新构建方法(写入分区并交换,使用一些东西来锁定资源,阶段所有的数据和使用TSQL合并等)

只是一个想法…如何将新记录写入临时表并间歇性地合并它?这样就有机会过滤掉重复的内容。

最新更新