我有一个 ETL 过程,可将约 40 个表从源数据库 (Oracle 10g) 提取到 SQL Server(2014 开发人员版)临时环境。我的提取过程:
- 确定暂存中的最新行
- 从源中选择所有较新的行
- 将结果插入#TEMPTABLE
- 将 #TEMPTABLE 的结果合并到 Staging
这可以在本地 Visual Studio 中逐个包地运行,也可以从 SQL Server 上的 SSISDB 执行。
不过,我将提取作业分组到一个主包中,以便于执行并流向转换阶段。我的包中只有大约 5 个使用临时表,其他的都是 trunc 和 load,但想将更多内容移至此方法。当我运行主包时,使用临时表的任何内容都会失败。由于日志文件相当大,很难查明实际错误,但到目前为止,它告诉我的是找不到 #TEMPTABLE 和/或状态为 VS_ISBROKEN。
我尝试过的事情:
- 将所有相关组件设置为
delay validation = false
- 主包有
ExecuteOutOfProcess = true
- 增加了我的 tempdb 容量,远远超出了我的需求
我的一个想法是RetainSameConnection = true
在我的临时数据库连接上 - 这可能是原因吗?我会尝试为每个创建单独的连接,但假设ExecuteOutOfProcess
会帮我处理这件事。
EDIT
我创建了以下场景:
- Package A (Master package containing Execute Package Task references only)
自行执行包 B 已成功完成。所有临时表的使用都包含在该包中 - 包 C 不需要查看包 B 创建的临时表。
执行包 C 成功完成。
执行包 A、C 成功完成,B 失败。
UPDATE
解决方法是为每个使用临时表的包创建包级连接,从而确保每个包拥有自己的连接。我向 Microsoft 提出了一个连接问题,因为我相信当父包打开连接时,它应该在所有子包中继承和保留。
针对您的情况提出几点建议。
- Set RetainSameConnection=true。这将使您能够安全地使用 SSIS 包中的 TEMP 表。
- 不会使用进程外执行,它会增加您的 RAM 占用空间,因为每个子包都会在其进程中启动,并降低性能 - 增加进程启动延迟。这在 32 位环境中用于克服 2 GB 限制,但在 x64 上不再需要。
子包执行不会从其父包继承连接对象实例,因此同一连接不会跨越所有子包。
- 带有临时表操作的SSIS包调试起来比较困难(不太明显),所以要注意测试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)