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