我有一个处理队列的SSIS包。 我目前有一个singel包,分为3个容器 1.收集一些元数据 做这项工作 3.重新检查元数据,更新我们认为发生的队列(失败的成功)
我对速度并不是很满意,部分原因是我在仓鼠驱动的服务器上运行,但这是我无法控制的。
中间件可能提供改进的机会...... 有20个表可能需要更新。 每个队列项将更新1个表。 我目前有一个包含20个序列容器的序列。
他们都做了同样的事情,但我无法找到一种方法来抽象它们。
每个中的第一个框是一个空脚本动作。如果tablename上存在匹配,则会有一个条件流向'guts'。
所以我打开了20个序列任务,20个空脚本任务并进行了20次T / F检查。
观看黄色/绿色灯光秀,这似乎很慢。
有更有效的方法吗?我认为改进它的唯一方法是在序列容器之外放置20个空脚本。可以节省的是打开容器。我不能相信打开一个序列容器是非常昂贵的。它是否可能每次都重新验证容器中的每个任务?
钓鱼,如果有人有任何想法,我会很高兴听到他们。
谢谢
格雷格
答案 0 :(得分:2)
您现在的主要问题是您在BIDS中运行此问题。这是为了使包的开发和调试变得容易,所以是的,它会在运行时验证所有对象。此外,“黄色/绿色灯光秀”更多的开销可以向您展示包装运行时发生的情况。当您使用DTSExec运行它或作为Sql server的计划任务的一部分时,您将获得更好的性能。你在记录你的包吗?如果是这样,请从服务器运行并查看日志以验证进程实际在服务器上执行的时间。如果在那时仍然花费太长时间,那么你可以实现一些@registered用户的想法。
答案 1 :(得分:1)
您是否并行运行每项任务?如果它必须连续循环遍历所有60个对象,那么您的主要改进空间就是并行运行每个对象。如果您尝试并行化流程,那么您可以做一些解决方案:
创建所有60个对象,每个对象包含3个对象。这对于设置而言是劳动密集型的,但它是最容易进行故障排除的,并允许您在必要时进行自定义。显然这并没有抽象出任何东西!
创建父包和子包。子包将包含您要执行的结构。父包包含20个执行包任务。这类似于1,但它提供的优势是,您只需要为3任务序列容器维护一组代码。这可能意味着您将转移到表驱动的元数据模型。如果要将数据从一台服务器传输到另一台服务器,这在使用CozyRoc Data Flow Plus任务的SSIS中运行良好。如果您在同一台服务器上执行所有操作,那么您实际上可能正在组织存储过程执行,这对于此模型很容易。
创建一个使用CozyRoc Parallel Task和Data Flow Plus的包。这可以允许您将所有逻辑封装在一个包中并并行执行所有逻辑。 警告我在SQL Server 2008 R2中尝试了这种方法并取得了巨大成功。但是,当SQL Server 2012发布时,CozyRoc并行任务的行为与之前版本中的行为不同,因为有些人在SSIS的封面更改下。我把它记录为CozyRoc的一个错误,但是我知道这个问题还没有解决(截至2013年4月1日)。此外,这个模型可能会抽象掉过多的ETL,并且在将来进行初始加载和对单个表加载进行故障排除会更加困难。
就个人而言,我使用解决方案1,因为我的任何团队成员都可以成功实现此代码。元数据驱动的解决方案很性感,但更难以正确编码。
答案 2 :(得分:1)
我建议您将20个更新包装在一个存储过程中。不知道你的输入数据有多变,我不知道这是多么合适,但这是我的第一反应。
答案 3 :(得分:1)
我在父序列容器的'top'添加了一个虚拟任务。从那里我添加了20个流链接到每个子序列容器(CSC)。现在每个CSC只在必要时才会打开。
我的吞吐量确实增加了大约30%(26 rpm - 最小采样时> 34 rpm)。
我可以用zmans回答或者注册用户。两者都有帮助。我之所以选择zmans是因为真正的答案总是从查看日志开始,看看到底有多长时间(绿色/黄色在我的体验中并不真实可靠)。
谢谢