【问题标题】:Parallel ssis execution并行 ssis 执行
【发布时间】:2021-04-12 17:57:16
【问题描述】:

我有大约 112 个包裹。实际上这些包是使用包主顺序执行的。

我需要并行执行这些包。我创建包主并手动添加所有这些包,但支持和维护并不容易。有没有办法或想法如何从表参数中提取所有包名称,然后自动并行执行它们而不是手动添加包?

【问题讨论】:

  • 你可以使用 SQL 来启动你的包,但你仍然在维护一些东西(在这种情况下是一个表)。
  • @KeithL 你能解释一下吗?

标签: ssis ssis-2012


【解决方案1】:

您可以在 foreach 循环中(在 SSIS 中)运行执行 SQL,也可以在 SSMS 中的 CURSOR 中运行。

这是假设您部署到 SSISDB。

BEGIN
    DECLARE @execution_id BIGINT
    EXEC [SSISDB].[catalog].[create_execution] 
        @package_name=N'[Package Name].dtsx'
        , @project_name=N'[ProjectName]'
        , @folder_name=N'[FolderName]'
        , @use32bitruntime=False
        , @reference_id=NULL
        , @execution_id=@execution_id OUTPUT

    -- Execute the package
    EXEC [SSISDB].[catalog].[start_execution] @execution_id
END

如果需要,您还可以添加参数。

这是一篇关于不同应用的好文章:https://www.timmitchell.net/post/2016/11/28/a-better-way-to-execute-ssis-packages-with-t-sql/

注意:默认为异步运行

【讨论】:

  • 我需要并行执行这些包。我已经使用 foreach 循环按顺序执行包。
  • 如果这是在 foreach 循环中执行的,它将异步运行(并行)并启动它们。
【解决方案2】:

SSIS 不支持开箱即用的此类场景。有一些方法可以做到这一点,但有一些限制。

异步退出主进程执行

@KeithL 的回答中描述的方法非常简单,但有一定的缺点:

  • 每个子包都以自己的执行方式开始。您最终可能会启动所有 112 个遇到资源短缺的包。在这种情况下,SSIS 引擎不会协调整体资源。
  • 程序包以自己的执行方式启动。它不继承父包参数或连接管理器。您必须通过调用 SQL 代码或环境变量映射重新设置它。
  • 从支持的角度来看 - 您在 SSIS 日志中获得了 113 次独立执行。不容易链接,尤其是在高负载系统上。

进程内执行

替代方案 - 使用 SSIS 任务 Package Run 处理这种并行调用方案。从 SSIS 设计方法来看,您必须描述在主包中运行的所有包。手工构建主包不实用,可以使用BIML。 BIML可以基于一些元数据构建你的主包;它确实很强大,但需要学习和练习。

有限的并行执行

在 SSIS 中使用控制变量 i 和循环存在条件 i==0 创建一个 For 循环块。在块中 - 使用 SQL 任务设置 i = select count(*) from <package_queue> with (updlock, readpast),如果 i==0 则处理为虚拟表达式任务;这是一个循环中断路径。否则,使用路径条件i>0 从包队列中读取一行,从队列中删除 if,并使用 Package Run 任务开始选定的包执行。

相当复杂,但这不是故事的结局。在 SSIS 主包中制作多个 Copy Loop 块的副本。因此,您将获得一个有限并发的并发执行框架。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2015-07-08
    相关资源
    最近更新 更多