1.MaxDOP maximum degree of parallelism
查询执行计划如何确定最大并行度?一般按照以下准则:
(1)若要使服务器能够确定最大并行度,请将此选项设置为默认值0。
(2)若将maximumdegreeofparallelism设置为0,SQLServer将能够使用至多64个可用的处理器。
(3)若要取消生成并行计划,请将maxdegreeofparallelism设置为1。
(4)将该值设置为1到32,767之间的数值来指定执行单个查询所使用的最大处理器核数。如果指定的值比可用的处理器数大,则使用实际可用数量的处理器。
(5)如果计算机只有一个处理器,将忽略maxdegreeofparallelism值
最佳实践建议:
请遵循以下准则:
(1)对于使用8个以上的处理器的服务器使用以下配置:MaxDOP =8。
(2)服务器的有8个或更少的处理器,使用下列配置其中N等于处理器数:MaxDOP =0到N。
(3)对于具有NUMA配置的服务器,MaxDOP 不应超过分配给每个NUMA节点的cpu数。
(4)超线程已启用的服务器的MaxDOP 值不应超过物理处理器的数量
1.1SSMS
SQL Server Management Studio(SSMS)>>右键单击SQL Server实例>属性>>高级>>最大并行度
在“最大并行度”框中,选择执行并行计划时所使用的最大处理器数。
在“并行”下,将“并行的开阀值”选项更改为所需值,键入或选择一个值(介于0到32767之间)
1.2SP_Config
在下例中,将最大并行度设置为8,将并行的开销阀值设置为10秒
EXECsp_configure'showadvancedoptions',1;
GO
RECONFIGUREWITHOVERRIDE;
GO
EXECsp_configure'maxdegreeofparallelism',1;
EXECsp_configure'costthresholdforparallelism',10;
GO
RECONFIGUREWITHOVERRIDE;
GO
EXECsp_configure'showadvancedoptions',1;
GO
RECONFIGUREWITHOVERRIDE;
GO
EXECsp_configure'maxdegreeofparallelism',1;
EXECsp_configure'costthresholdforparallelism',10;
GO
RECONFIGUREWITHOVERRIDE;
GO
1.3现象
运行一段代码发现报错,排查了相关代码,最后把其中拼接的sql 贴到SQL server 中运行,发现报同样的错误:‘The query processor could not start the necessary thread resources for parallel query execution.(解决方式,把并行度关闭,修改成1)
回顾追溯问题原因的过程:
- 在排查后台相关方法逻辑没有问题的前提下,贴出拼接的sql语句,发现有可能是sql 的问题。
- 查看出问题的sql 的执行计划,发现是并行查询。对于SQL Server 来说,最终的执行计划是需要多方面评估决定的结果,同时还会参照当前运行的硬件资源,遇到的问题有可能是某些硬件不支持,比如: 内存限制、CPU限制、IO瓶颈等。
- 排除了硬件资源的限制,发现SQL Server 在处理某个数据集比较大,耗费资源比较多的时候,会采用并行的方法,把数据集拆分成若干个,若干个线程同时处理,来提高整体效率。当前的报错也是无法提供额外的线程资源,由此问题原因归咎于最大并行度。
- MaxDOP 设置成1 的原因是,处理的任务只会由一个线程来处理,所以就不会有线程资源不够用的错误报出