【问题标题】:SSIS - using table variable in multiple, parallel tasksSSIS - 在多个并行任务中使用表变量
【发布时间】:2015-02-25 12:30:03
【问题描述】:

我正在编写具有以下逻辑的 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。

【问题讨论】:

  • 您可以使用全局临时表而不是表变量。甚至是您在包末尾截断的永久表。

标签: sql-server-2008 ssis parallel-processing table-variable


【解决方案1】:

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

 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>

等等

【讨论】:

  • 感谢 Ann L。在各个任务之间复制变量肯定会奏效。但是,数据在 link1.some_table 处发生变化的风险很小,从而导致查询之间的结果不一致。现在,在本地表而不是本地变量中缓存数据是很诱人的(我们在本地得到一个静态的@tbl 数据快照)但我害怕在链接服务器表和本地表之间编写 JOIN 子句 - 远程查询已经非常复杂(这确实是一个视图)。我会试一试,如果它有效,会将您的答案标记为正确。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多