我正在使用SSIS 2014。我有几千万行来自 Attunity Oracle Source 组件,它的源查询有 20 列,而且很耗时。出于某种原因,我需要在另一个引用第一个表的表中插入同一查询的 2 列。
我想避免在另一个 DataFlowTask 中再次调用查询,因此我正在考虑创建一个WAIT till x_01 finishes
脚本组件任务,该任务将在x_01
OleDB 目标完成时进行验证,然后继续插入第二个表。
请了解我想在这里实现的目标:
我正在考虑使用x_01_Finished
Package Scope 变量并在从 触发 PostExecute 事件时更改其值,但不幸的是 PostExecute 在OleDB 目标级别x_01
不可用。x_01
问题一:
有没有办法在脚本组件代码中获取其他组件的状态?
类似于以下内容:
public override void PreExecute() {
base.PreExecute();
int sec = 5; //number of seconds to check the status of x_01 Component
int ms = sec * 1000;
bool lbo_x01_Finished = false;
do {
System.Threading.Thread.Sleep(ms);
lbo_x01_Finished = IsComponent_Finished("x01"); //returns true when x01 component finished
} while(!lbo_x01_Finished);
}
问题2:
您认为使用这种技术会极大地影响包装性能吗?
更新 1
已经用非常少量的数据尝试了Nick.McDermaid的建议。我创建了 2 个临时表,一个在第一列中带有 PK,第二个表在第一个表的这个 PK 中带有 FK。即使有这么少量的数据,我也得到了这个错误:The INSERT statement conflicted with the FOREIGN KEY constraint "FK_tmp_1_tmp_2".
您可以在下面的屏幕截图中看到插入确实非常快,并且在第二个数据块中,x_02
打算在第一个数据块之前插入的对象(这是不可能的由于这个FK)。
所以,我的下一个想法是在插入第二个表之前只读取第一行的同时睡几毫秒。我们将看看这是否有帮助。