我一直在阅读有关MaxDOP的内容,并遇到了一个我似乎无法找到答案的问题。如果MaxDOP设置为一个值,让我们说8,这是否意味着SQL Server将始终在查询中的并行活动上启动8个线程,或者它是否可以决定为特定运算符使用更少的线程?
归结为:如果工作负载很小(OLTP)并且MaxDOP设置得太高,是否会有太多线程出现性能问题?
提示正确的DMW会很好。我再次迷失在DMW的土地上。
答案 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之外,还有“并行成本阈值”设置,它决定是否考虑并行计划进行查询。