【问题标题】:Duplicate rows on ole db destinationole db 目标上的重复行
【发布时间】:2013-01-16 11:58:59
【问题描述】:

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

目前有一个查找检查目标表以查看记录是否存在,因此插入在其“不匹配”输出上完成。它不会阻止错误,因为查找是在包启动时加载的,因此两个包都在其上获得相同的数据,如果有一行出现,它们都会认为它是“新”行,所以第一个成功,第二个失败.

有什么办法可以避免这种情况?几乎忽略了 oledb 目标上的“重复行”?我不能使用 MAX ERROR COUNT,因为重复的行与不在第一个包上的其他行之间存在差异,应该插入。

【问题讨论】:

  • 这是否带有 Access 数据库或 Exel 电子表格?
  • sql server 源和目标
  • 不能插入PK吗?

标签: sql sql-server ssis


【解决方案1】:

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

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

如果您无法控制包执行以使并发数据流触发,那么您应该考虑重新构建该方法(写入分区并换入,使用某些东西来锁定资源,暂存所有数据并使用 TSQL合并等)

【讨论】:

  • 谢谢,我想到了这一点,但我应该提到有问题的数据集可能包含超过 1M 的行,因此部分缓存不是一个选项。更糟糕的是,它们的值非常稀疏,因此即使是不匹配缓存百分比也无法避免数据库上的 1M 选择
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多