SSIS - 执行同一任务的 N 个并发实例
SSIS - execute N concurrent instances of the same task
我目前正在处理一个 SSIS 包。它所做的是将完全相同的 SQL 语句运行 10 次,每次使用不同的参数 N 值(N 从 0 到 9)。语句彼此独立(它们只是 INSERT INTO ... SELECT * FROM ... WHERE some_int_column % 10 = N)。
我当前的实现非常幼稚:我创建了 10 个相同的 .sql 文件副本,其中包含 10 个不同的 N 值,然后创建了 10 个单独的 "Execute SQL" 任务并将每个任务指向不同的SQL 个文件。
这很好用。但现在我需要能够动态更改 N 的最大值,即创建 Nmax 并行任务,每个任务具有不同的参数值(从 0 到 Nmax-1)。
我应该如何处理这个问题?我在考虑一个 FOR 循环,但你不能在 SSIS 中获得一个异步 FOR 循环,所以这是行不通的。还有其他想法吗?
我正在使用 SQL Server 2008 R2。
在SQL中,我们竭尽所能避免循环。
我们成套思考。
假设您现有的过程如下所示:
ALTER PROCEDURE some_procedure (
@n int
)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO something (column_list)
SELECT column_list
FROM something_else
WHERE some_int_column % 10 = @n
;
END
;
这里有一个很小的变化,看看你能不能发现!
ALTER PROCEDURE some_procedure (
@n int
)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO something (column_list)
SELECT column_list
FROM something_else
WHERE some_int_column % 10 <= @n
;
END
;
你看到了吗? = @n
变成了<= @n
考虑到您想要为 @n=0
到 @n=3
执行此操作。在第一个过程中我们会做:
EXEC some_procedure @n=0;
EXEC some_procedure @n=1;
EXEC some_procedure @n=2;
EXEC some_procedure @n=3;
但是随着更新,我们可以做到:
EXEC some_procedure @n=3;
关于并行度的更新:
遗憾的是,SSIS 当前不在 ForEach 循环中包含此类功能。这在过去已作为连接项目提出 (https://connect.microsoft.com/SQLServer/feedback/details/544304/ssis-parallel-foreach-loop),但它看起来不会很快出现。
据我所知,您还有另外两个选择:
- 在 SSIS 中创建
X
ForEach 循环任务并让它们处理它们之间的 @n%X
任务。显然,这意味着您只能获得与您创建的任务数量一样多的并行度。
- 推出您自己的托管代码解决方案,可以产生自己的线程。
不是你要找的答案,但你是我现阶段能想到的所有选择!
抱歉,我知道这不是最好的解释,所以如果有什么不清楚的地方,请在评论中提出任何问题,我会尽力改进我的答案!
我可能会使用脚本组件来完成此操作。
它将包含一个从 1 到 N 的循环
并致电
SqlCommand.BeginExecuteNonQuery
这是异步的(即,它 returns 立即)。
这将提供您需要的并行性。
我目前正在处理一个 SSIS 包。它所做的是将完全相同的 SQL 语句运行 10 次,每次使用不同的参数 N 值(N 从 0 到 9)。语句彼此独立(它们只是 INSERT INTO ... SELECT * FROM ... WHERE some_int_column % 10 = N)。
我当前的实现非常幼稚:我创建了 10 个相同的 .sql 文件副本,其中包含 10 个不同的 N 值,然后创建了 10 个单独的 "Execute SQL" 任务并将每个任务指向不同的SQL 个文件。
这很好用。但现在我需要能够动态更改 N 的最大值,即创建 Nmax 并行任务,每个任务具有不同的参数值(从 0 到 Nmax-1)。
我应该如何处理这个问题?我在考虑一个 FOR 循环,但你不能在 SSIS 中获得一个异步 FOR 循环,所以这是行不通的。还有其他想法吗?
我正在使用 SQL Server 2008 R2。
在SQL中,我们竭尽所能避免循环。
我们成套思考。
假设您现有的过程如下所示:
ALTER PROCEDURE some_procedure (
@n int
)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO something (column_list)
SELECT column_list
FROM something_else
WHERE some_int_column % 10 = @n
;
END
;
这里有一个很小的变化,看看你能不能发现!
ALTER PROCEDURE some_procedure (
@n int
)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO something (column_list)
SELECT column_list
FROM something_else
WHERE some_int_column % 10 <= @n
;
END
;
你看到了吗? = @n
变成了<= @n
考虑到您想要为 @n=0
到 @n=3
执行此操作。在第一个过程中我们会做:
EXEC some_procedure @n=0;
EXEC some_procedure @n=1;
EXEC some_procedure @n=2;
EXEC some_procedure @n=3;
但是随着更新,我们可以做到:
EXEC some_procedure @n=3;
关于并行度的更新:
遗憾的是,SSIS 当前不在 ForEach 循环中包含此类功能。这在过去已作为连接项目提出 (https://connect.microsoft.com/SQLServer/feedback/details/544304/ssis-parallel-foreach-loop),但它看起来不会很快出现。
据我所知,您还有另外两个选择:
- 在 SSIS 中创建
X
ForEach 循环任务并让它们处理它们之间的@n%X
任务。显然,这意味着您只能获得与您创建的任务数量一样多的并行度。 - 推出您自己的托管代码解决方案,可以产生自己的线程。
不是你要找的答案,但你是我现阶段能想到的所有选择!
抱歉,我知道这不是最好的解释,所以如果有什么不清楚的地方,请在评论中提出任何问题,我会尽力改进我的答案!
我可能会使用脚本组件来完成此操作。
它将包含一个从 1 到 N 的循环 并致电
SqlCommand.BeginExecuteNonQuery
这是异步的(即,它 returns 立即)。
这将提供您需要的并行性。