2013-01-16 41 views
0

我有一个相当复杂的情况,其中可以并行运行相同的程序包。在某些情况下,两种执行都可能最终尝试将同一行插入到目标中,这会导致主键错误的违反。ole db目的地上的重复行

目前有一个查找检查目标表以查看存在的记录,以便插入在其“不匹配”输出上完成。它不会阻止错误,因为查找会加载到程序包启动上,因此两个程序包都会在其上获取相同的数据,如果两行中都有行,则会将其视为“新”行,以便第一个成功,第二个成功。

任何可以避免这种情况的方法?几乎忽略oledb目的地的“重复行”?我不能使用最大错误计数,因为重复的行在其他行中不在第一个包上并且应该插入。

+0

这是Access数据库还是Exel电子表格? – Derek

+0

sql server源和目的地 – Diego

+0

你可以不插入PK吗? – Bulat

回答

2

默认查找行为是采用全高速缓存模式。正如您所看到的,在包验证阶段,它会将所有查找值都拉到本地内存缓存中,并使用它导致缺少对表的更新。

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

如果你不能控制包执行,以便并发数据流被触发,那么你应该考虑重新设计方法(写入分区和交换,使用某些东西来锁定资源,暂存所有数据并使用TSQL合并等)

+0

感谢人,想到这一点,但我应该提到,有问题的数据集可能包含超过1M行,所以部分缓存不是一个选项。要做到最差,它们的值非常稀疏,所以即使不匹配缓存百分比也不会在数据库中避免1M选择 – Diego

0

只是一个想法...如何将新记录写入临时表并合并它间歇?这将有机会过滤出重复。