【发布时间】:2013-11-05 16:57:09
【问题描述】:
我正在尝试将数据插入数据库,但首先我使用查找来检查每一行是否存在,类似于此处建议的方法: How to prevent SSIS from importing data from a file that already exist in database?
SELECT DISTINCT VALUES // OleDb Source
|
LOOKUP // If exists
| // No Match Output
OLE DB DESTINATION // Insert new records
我正在使用RetainSameConnection=True 在我的工作流程中启用事务。使用大约 10,000 行的默认缓冲区,当行传递到 OLE DB 目标时,目标 INSERT 将使用查找 SELECT 锁定。
我已经尝试过SET READ_COMMITTED_SNAPSHOT ON,它会起作用,但是现在查找期间的性能非常慢,我认为这是由于 RetainSameConnection 属性,我无法判断 SSIS 甚至使用了 READ COMMITTED SNAPSHOT隔离级别。我考虑过忽略目标上的失败,但我读到它会导致批量插入完全失败,而不是逐行失败。我也考虑过在所有读取中使用 NOLOCK,但它会将我的所有查找转换为 SQL 查询。
源数据库可能读取数百万行。 有没有更好的方法来做到这一点?
【问题讨论】:
-
您为查找选择了什么缓存?您如何配置 ole db 目标?您的来源可以在内部有重复项吗?我看到您应用了
DISTINCT,但是查找是否可以为同一集中的不同行生成相同的键?您的源与目标中的数据量是多少?
标签: sql-server ssis sql-server-2012