SQL Server在执行SSIS包时强制执行多头处理

时间:2015-06-02 21:52:43

标签: sql-server multithreading sql-server-2008 ssis

以下是问题: 我正在使用VisualCron在SQL Server 2008 R2上运行ssis包。 SSIS包将运行一个查询,该查询获得数百万行并将其输出到一个平面文件中。有时候,我发现当我运行这个SSIS包时,sql server不使用多线程(我可以从活动监视器中看出来),这导致很长的运行时间大约20个小时。但是,如果它使用多线程,它可以在8分钟内完成。

有没有办法强制sql server在运行这个SSIS包时使用多线程?

2 个答案:

答案 0 :(得分:0)

有一些选项可用于优化查询以处理多个同时操作......或者至少可以提高性能。

  1. 在查询中应用OPTION MAXDOP以应用操作系统可用的最大处理器数(并行度)。下面列出的是一个示例,此处是link,其中包含更多详细信息。

    SELECT FirstName,LastName 来自dbo.Customer 选项(MAXDOP 1)

  2. 如果在SSIS包操作期间更新的表中的数据不存在问题,请在查询中应用NOLOCK。也就是说,如果不关心"脏读,这就有效。"请参阅以下link和示例。

    SELECT FirstName,LastName 来自dbo.Customer WITH(NOLOCK)

  3. 查看此link,了解提高查询效果的最佳做法。您可能还有其他未执行的步骤或未应用的工具,这些步骤可以极大地帮助您提高性能。

答案 1 :(得分:0)

问题越来越清晰 它与sql如何决定使用串行执行计划或并行执行计划有关。这是优化者的工作。事实证明,我在VisualCron中有两个计划运行的任务,它们都将运行相同的大查询。不同之处在于它们会得到不同的输入参数 第一个获取的参数不会处理太多数据 第二个获取处理大量数据的参数。

我假设SQL优化器首先看到提交的查询,并且查询不会获得太多数据,因此它决定使用串行计划。

我猜这个相同查询的计划是缓存的,所以当它检查第二个提交的查询时,优化器可能会检查缓存以查看此查询是否存在任何过去的评估计划。然后,如果它存在,它将使用它。 这就是为什么它仍然选择使用串行计划进行第二次查询的原因。

在我改变两个任务的顺序后(我执行首先处理更多数据的那个,然后处理更少数据的那个),它可以工作,它现在使用并行计划。 (您可能需要重新启动实例以清除缓存的执行计划)

优化器的工作原理仍然是我的假设。

其他人的帖子,解释优化者如何在这里发挥重要作用

http://web.archive.org/web/20180404164406/http://sqlblog.com/blogs/paul_white/archive/2011/12/23/forcing-a-parallel-query-execution-plan.aspx