我有一个查询源表和目标表的SSIS包,执行全外连接合并连接,然后使用条件拆分来检测相应插入/更新/删除的差异。大约80个表完成此操作,并且大部分过程成功完成。尽管如此,由于阻止查询,我最近遇到了一些问题。
如果在目标数据源完成检索现有数据之前将数据批量插入目标表,则该过程将挂起。
有没有办法可以让进程等到查询现有数据再插入数据之前。或者,在读取表时,是否有更好的策略来处理将数据插入目标表。
答案 0 :(得分:1)
完成了很多这些后,我已经转向更复杂的模式,表现更好。其他人可能会采用不同的方式,但这对我有用。
首先,我使用查找转换而不是合并连接。设置为完全缓存的查找转换(默认设置)将在数据流执行之前完全加载数据。这应该识别插入并快速更新。插入可以直接从此数据流运行,但是对于更新...
作为数据流的一部分进行更新的唯一真正方法是使用OLEDB命令转换。这些都是出了名的慢。相反,我将所有数据更新写入数据流中的临时缓存表,然后将一个执行SQL项添加到我的控制流,该控制流从缓存表更新目标表中的记录。
不要忘记执行SQL项来截断缓存表。
最后,我使用目标表中的select和源表的查找转换来识别数据流的删除。再次,写入缓存表,然后使用批处理执行SQL命令删除所有。
所以现在我的控制流有一个Execute SQL来截断缓存表,一个数据流用于插入和缓存更新,一个执行SQL来执行更新,一个数据流来缓存删除,以及执行SQL来执行删除。如果包使用多个Source表,我通常会将每个目标表的所有控制流项目放入一个Sequence Container。没有必要,但帮助我看到逻辑结构。