Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 如何使此SSIS场景更加并行_Sql Server 2008_Ssis - Fatal编程技术网

Sql server 2008 如何使此SSIS场景更加并行

Sql server 2008 如何使此SSIS场景更加并行,sql-server-2008,ssis,Sql Server 2008,Ssis,我在一个数据库表中有一百万行。对于每一行,我必须运行一个自定义exe,解析输出并更新另一个数据库表 如何并行运行多行进程 我现在有一个简单的数据流任务->获取数据->运行脚本运行进程,解析输出->存储数据 对于6000行,它花费了3个小时。太多了。如果使用数据流容器执行此过程,则其上有一个名为EngineThreads的属性,默认值为5。您可以将其设置为更高的数字,如20,这将花费更多的线程来处理这些行 这只是一个性能调整或优化,如果您的ssis包运行速度仍然很慢,那么我可能会介绍包的体系结构和

我在一个数据库表中有一百万行。对于每一行,我必须运行一个自定义exe,解析输出并更新另一个数据库表

如何并行运行多行进程

我现在有一个简单的数据流任务->获取数据->运行脚本运行进程,解析输出->存储数据
对于6000行,它花费了3个小时。太多了。

如果使用数据流容器执行此过程,则其上有一个名为EngineThreads的属性,默认值为5。您可以将其设置为更高的数字,如20,这将花费更多的线程来处理这些行


这只是一个性能调整或优化,如果您的ssis包运行速度仍然很慢,那么我可能会介绍包的体系结构和设计。

如果您使用数据流容器执行此过程,则其上有一个名为EngineThreads的属性,默认值为5。您可以将其设置为更高的数字,如20,这将花费更多的线程来处理这些行


这只是一个性能调整或优化,如果您的ssis包运行速度仍然很慢,那么我可能会讨论您的包的体系结构和设计。

这里有一个瓶颈,即每行运行一个进程。增加EngineThreads不会有任何帮助,因为无论如何只有一个线程运行这个特定的脚本转换。在其他转换中花费的时间可能根本不重要。进程是很重的对象,运行数千个进程永远不会便宜

我可以想出以下想法使它更好:

1解决此问题的最佳方法是将自定义EXE转换为程序集,并从脚本转换中调用它-以避免创建进程、解析输出等的开销

2如果必须使用单独的进程,可以尝试并行运行这些进程。如果进程主要等待一些输入/输出,即它是i/O绑定的,那么它会有所帮助。如果进程是内存受限的或CPU受限的,那么并行运行它们不会带来太多好处

2A复杂的脚本,简单的包

要并行运行它们,请修改脚本中的ProcessInput方法以异步启动流程,不要等待流程完成—移动到下一行并创建下一个流程。订阅进程输出和进程退出事件,以便您知道它何时完成。限制并行运行的进程数-否则将耗尽内存。等待所有进程完成,然后从ProcessInput调用返回

简单的脚本,复杂的包

保留当前的顺序脚本,但使用SSI对数据进行分区。添加条件拆分转换,并基于某个哈希表达式将输入流拆分为多个流—这将使每个输出接收大致相同的数据量。流的数量等于要并行运行的进程实例的数量。将脚本转换添加到条件拆分的每个输出中。现在您还应该增加引擎线程属性:这些转换将并行运行。注意:基于标记,我假设您使用SSIS 2008。您需要插入额外的Union All转换,以使其在SSIS 2005中工作


这应该会使它的性能更好,但数百万个进程是很多的。这里很难获得真正好的性能。

这里有一个瓶颈,每行运行一个进程。增加EngineThreads不会有任何帮助,因为无论如何只有一个线程运行这个特定的脚本转换。在其他转换中花费的时间可能根本不重要。进程是很重的对象,运行数千个进程永远不会便宜

我可以想出以下想法使它更好:

1解决此问题的最佳方法是将自定义EXE转换为程序集,并从脚本转换中调用它-以避免创建进程、解析输出等的开销

2如果必须使用单独的进程,可以尝试并行运行这些进程。如果进程主要等待一些输入/输出,即它是i/O绑定的,那么它会有所帮助。如果进程是内存受限的或CPU受限的,那么并行运行它们不会带来太多好处

2A复杂的脚本,简单的包

要并行运行它们,请修改脚本中的ProcessInput方法以异步启动流程,不要等待流程完成—移动到下一行并创建下一个流程。订阅进程输出和进程退出事件,以便您知道它何时完成。限制并行运行的进程数-否则将耗尽内存。等待所有进程完成,然后从ProcessInput调用返回

简单的脚本,复杂的包

保留当前的顺序脚本,但使用SSI对数据进行分区。A. dd conditional split transform,并基于某个哈希表达式将输入流拆分为多个流—这将使每个输出接收大约相同数量的数据。流的数量等于要并行运行的进程实例的数量。将脚本转换添加到条件拆分的每个输出中。现在您还应该增加引擎线程属性:这些转换将并行运行。注意:基于标记,我假设您使用SSIS 2008。您需要插入额外的Union All转换,以使其在SSIS 2005中工作

这应该会使它的性能更好,但数百万个进程是很多的。你在这里很难有好的表现