MaxDOP = 8,这是否意味着所有并行运算符上有8个线程?

时间:2015-02-06 08:44:53

标签: sql-server multithreading

我一直在阅读有关MaxDOP的内容,并遇到了一个我似乎无法找到答案的问题。如果MaxDOP设置为一个值,让我们说8,这是否意味着SQL Server将始终在查询中的并行活动上启动8个线程,或者它是否可以决定为特定运算符使用更少的线程?

归结为:如果工作负载很小(OLTP)并且MaxDOP设置得太高,是否会有太多线程出现性能问题?

提示正确的DMW会很好。我再次迷失在DMW的土地上。

3 个答案:

答案 0 :(得分:0)

它仅用于限制每个请求允许的最大线程数: https://msdn.microsoft.com/en-us/library/ms189094.aspx

因此,如果SQL认为使用一个线程最快,则只使用一个。

通常在OLTP系统上,您将保持低端。在大型仓库DB上,您可能希望保留更高的数字。

除非您看到具体问题,否则我不会改变它,除非您对结果有信心。

答案 1 :(得分:0)

简短的回答是:SQL Server将动态决定使用查询的并行执行,但不会超过您指定的最大并行度(MAXDOP)。

以下文章提供了一些更详细的信息:How It Works: Maximizing Max Degree Of Parallelism (MAXDOP)。我在这里引用它的一部分:

  

确定查询可以使用的并行度(MAXDOP)有几个阶段。

     

第1阶段 - 编译

     

在复杂化期间,SQL Server会考虑提示,sp_configure和资源工作组设置,以查看是否应该考虑并行计划。仅当查询操作允许并行执行时:

If hint is present and > 1 then build a parallel plan

else if no hint or hint (MAXDOP = 0)

      if sp_configure setting is 1 but workload group > 1 then build a parallel plan

      else if sp_configure setting is 0 or > 1 then build parallel plan
     

第2阶段 - 查询执行

     

当查询开始执行运行时,确定并行度。这涉及许多因素,已在SQL Server联机丛书中概述:http://technet.microsoft.com/en-US/library/ms178065(v=SQL.105).aspx

     

在SQL Server查看空闲工作者和其他因素之前,它确定了并行度的目标。

     

[...详见文章......]

     

如果在详细计算后仍为0,则将其设置为64(如联机丛书中所述,SQL Server的默认最大值。)[...]当MAXDOP的运行时目标仍为0时,SQL Server硬编码64 CPU目标(默认)

     

MAXDOP目标现在调整为:

     
      
  • 实际CPU计数(来自sp_configure和资源池的亲缘关系设置)。

  •   
  • 某些查询类型(例如索引构建)查看分区

  •   
  • 可能存在的其他查询类型限制

  •   
     

现在,SQL Server会查看可用的工作人员(查询执行的免费工作人员。)您可以使用(Free workers = Current_workers_count - current_tasks_count)从{{{{{{{ {1}}。

     

计算目标后,通过查看支持并行执行的可用资源来确定实际值。这涉及确定具有可用工作人员的节点和CPU。

     

[...]

     

然后使用工作者位置信息来定位一组适当的CPU,以将并行任务分配给。

     

使用XEvents可以监控MAXDOP决策逻辑。例如:

     
      
  • XeSqlPkg :: calculate_dop_begin
  •   
  • XeSqlPkg :: calculate_dop
  •   
     

您可以通过查询来监控并行工作者的数量:sys.dm_os_schedulers

答案 2 :(得分:0)

SQL Server也可以决定使用更少的线程,您可以从实际计划中看到它们与每个线程处理的行数。线程的最大值也适用于每个并行部分,一个查询可以有多个部分。

除了MAXDOP之外,还有“并行成本阈值”设置,它决定是否考虑并行计划进行查询。