以下是问题: 我正在使用VisualCron在SQL Server 2008 R2上运行ssis包。 SSIS包将运行一个查询,该查询获得数百万行并将其输出到一个平面文件中。有时候,我发现当我运行这个SSIS包时,sql server不使用多线程(我可以从活动监视器中看出来),这导致很长的运行时间大约20个小时。但是,如果它使用多线程,它可以在8分钟内完成。
有没有办法强制sql server在运行这个SSIS包时使用多线程?
答案 0 :(得分:0)
有一些选项可用于优化查询以处理多个同时操作......或者至少可以提高性能。
在查询中应用OPTION MAXDOP以应用操作系统可用的最大处理器数(并行度)。下面列出的是一个示例,此处是link,其中包含更多详细信息。
SELECT FirstName,LastName 来自dbo.Customer 选项(MAXDOP 1)
如果在SSIS包操作期间更新的表中的数据不存在问题,请在查询中应用NOLOCK。也就是说,如果不关心"脏读,这就有效。"请参阅以下link和示例。
SELECT FirstName,LastName 来自dbo.Customer WITH(NOLOCK)
查看此link,了解提高查询效果的最佳做法。您可能还有其他未执行的步骤或未应用的工具,这些步骤可以极大地帮助您提高性能。
答案 1 :(得分:0)
问题越来越清晰 它与sql如何决定使用串行执行计划或并行执行计划有关。这是优化者的工作。事实证明,我在VisualCron中有两个计划运行的任务,它们都将运行相同的大查询。不同之处在于它们会得到不同的输入参数 第一个获取的参数不会处理太多数据 第二个获取处理大量数据的参数。
我假设SQL优化器首先看到提交的查询,并且查询不会获得太多数据,因此它决定使用串行计划。
我猜这个相同查询的计划是缓存的,所以当它检查第二个提交的查询时,优化器可能会检查缓存以查看此查询是否存在任何过去的评估计划。然后,如果它存在,它将使用它。 这就是为什么它仍然选择使用串行计划进行第二次查询的原因。
在我改变两个任务的顺序后(我执行首先处理更多数据的那个,然后处理更少数据的那个),它可以工作,它现在使用并行计划。 (您可能需要重新启动实例以清除缓存的执行计划)
优化器的工作原理仍然是我的假设。
其他人的帖子,解释优化者如何在这里发挥重要作用