1

我正在处理具有以下逻辑的 T-SQL 脚本:

declare @tbl table(id int)

insert @tbl select distinct id -- <-- this takes about 3 minutes
  from link1.some_table
  where <some_conditions>

insert some_local_table(field1, field2, fieldN)  -- <-- this takes about 30 minutes
  select field1, field2, fieldN
  from link2.some_table
  where id in (select id from @tbl)
    and <some conditions>

insert some_OTHER_local_table(field1, field2, fieldN) -- <-- another 30 minutes
  select field1, field2, fieldN
  from link2.some_OTHER_table
  where id in (select id from @tbl)
    and <some conditions>

insert some_YET_OTHER_local_table(field1, field2, fieldN) -- <-- another 30m, and so on
  select field1, field2, fieldN
  from link2.some_YET_OTHER_table
  where id in (select id from @tbl)
    and <some conditions>

...依此类推,有 5 个插入来自链接服务器 link2 的 5 个不同的本地表,但使用来自链接服务器 link1 的 @tbl 过滤。

填充每个本地表大约需要 30 分钟,因此整个脚本需要大约 2.5 小时。

我正在尝试并行化此过程,因此我将 5 个插入中的每一个放入单独的 SSIS 任务中并同时执行它们。但是,我不知道如何在 SSIS 中的任务之间共享 @tbl 表变量。在脚本中,@tbl 只是一个变量。在 SSIS 中没有表变量。顺便提一句。该表包含大约 200K id 值,因此无法构建逗号分隔的字符串。

所以问题是:如何实现一个共享的、“一次性的”、包级别的记录集对象,该对象将从数据库查询中初始化,然后用于同一个包中的几个并行任务?

我在 SQL Server 2008 R2 上。

4

1 回答 1

0

您不能在每个任务中使用子查询而不是表变量吗?

 insert some_local_table(field1, field2, fieldN)  
 select field1, field2, fieldN
 from link2.some_table
 where id in (
      select id   
      from link1.some_table
      where <some_conditions>
   )
 and <some conditions>

... 等等?

您将在每个任务中重复 3 分钟的查询,但与您所说的包在串行运行时所花费的 2.5 小时相比,这是很小的。

或者,因为link1这是一个链接服务器,并且在本地缓存数据可能会更快(就像您在原始序列中所做的那样),所以给每个任务一个局部变量:

declare @tbl table(id int)

insert @tbl select distinct id -- <-- this takes about 3 minutes
  from link1.some_table
  where <some_conditions>

insert some_local_table(field1, field2, fieldN)  -- <-- this takes about 30 minutes
  select field1, field2, fieldN
  from link2.some_table
where id in (select id from @tbl)
   and <some conditions>

... 接着

declare @tbl table(id int)

insert @tbl select distinct id -- <-- this takes about 3 minutes
  from link1.some_table
  where <some_conditions>

insert some_OTHER_local_table(field1, field2, fieldN) -- <-- another 30 minutes
  select field1, field2, fieldN
    from link2.some_OTHER_table
   where id in (select id from @tbl)
     and <some conditions>

等等

于 2015-02-25T13:20:13.657 回答