坑系列 (SQL ) -> SQL server 设置最大并行度,解决报错【查询处理器不能够为并行查询提供必要的线程资源(The query processor could not start the necessary thread resources for parallel query execution.)】
运行一段代码发现报错,排查了相关代码,最后把其中拼接的sql 贴到SQL server 中运行,发现报同样的错误:‘The query processor could not start the necessary thread resources for parallel query execution.’(翻译为查询处理器不能够为并行查询提供必要的线程资源):
查找了网上有关的解决办法,最终修改SQL server的设置,把最大并行度(MaxDOP maximum degree of parallelism)改为1,问题解决。
回顾追溯问题原因的过程:
- 在排查后台相关方法逻辑没有问题的前提下,贴出拼接的sql语句,发现有可能是sql 的问题。
- 查看出问题的sql 的执行计划,发现是并行查询。对于SQL Server 来说,最终的执行计划是需要多方面评估决定的结果,同时还会参照当前运行的硬件资源,遇到的问题有可能是某些硬件不支持,比如: 内存限制、CPU限制、IO瓶颈等。
- 排除了硬件资源的限制,发现SQL Server 在处理某个数据集比较大,耗费资源比较多的时候,会采用并行的方法,把数据集拆分成若干个,若干个线程同时处理,来提高整体效率。当前的报错也是无法提供额外的线程资源,由此问题原因归咎于最大并行度。
- MaxDOP 设置成1 的原因是,处理的任务只会由一个线程来处理,所以就不会有线程资源不够用的错误报出。
围绕这个问题其实涉及到了一些知识点,简要总结如下:
- 并行 -> 参考另一篇文章:https://www.cnblogs.com/z7luv/p/15305724.html
- SQL server的最大并行度:
- 为什么要关注这个系统参数配置(含义,重要性和优势)?
- MaxDOP可以控制每个运算符的并行数,指定的是每个运算符最大的并行数(【注】: 是每个运算符的,而不是全部的),会影响运行性能;
- 如何查看当前设置的MaxDOP ?
- 第一种方式:
![]()
- 第二种方式:
SQL Server Management Studio(SSMS)>>右键单击SQL Server实例>属性>>高级>>最大并行度![Default value of SQL Server Degree Parallelism]()
ps: 图片来源于第二个链接
- 第一种方式:
- 设置最大并行度的一般准则:
(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 值不应超过物理处理器的数量。
- 根据系统类型(也可以理解为系统负载)来设置 MaxDOP :
-
OLTP系统:
在纯OLTP系统上,它的事务较短,SQL查询时间短,但是非常频繁。设置“Maximum degree of Parallelism”(MAXDOP)为1。这样做可以确保查询永远不必使用并行方式运行,并且不会导致更多的数据库引擎开销。
-
OLAP系统:
Data-warehousing / Reporting server: 因为查询执行时间一般较长,建议设置“Maximum degree of Parallelism”(MAXDOP)为0。
这样大多数查询将会利用并行处理,执行时间较长的查询也会受益于多处理器而提高性能。
-
混合系统
Mixed System (OLTP & OLAP):这样环境会是一个挑战,必须找到正确的平衡点。一般采取了非常简单的方法。设置“Maximum degree of Parallelism" MAXDOP)为2,这样意味着查询仍会使用并行操作但是仅利用2颗CPU。并且把“并行查询阀值”(cost threshold for parallelism)设置为较高的,这样的话,不是所有的查询都有资格使用并行,除了那些查询成本较高的查询。
-
- 为什么要关注这个系统参数配置(含义,重要性和优势)?
参考链接:
- sql并行度_SQL Server最大并行度的重要性 (中英文又有图文,好博客也不过如此了👏)
- SQL Server 最大并行度 (围绕MaxDOP 从概念到最佳实践,讲解详细,有了一个大体的认识,值得推荐👍)
- 在SQL Server中设置最大并行度的不同方法 (设置最大并行度的不同方法🤞)
- https://www.cnblogs.com/amylis_chen/p/8087894.html (有参考对并行和最大并行度👍)
(The query processor could not start the necessary thread resources for parallel query execution.)
- c# - The query processor could not start the necessary thread resources for parallel query execution - Stack Overflow (基于这个报错的讨论)
- ERROR : The query processor could not start the necessary thread resources for parallel query execution. – SQLServerCentral Forums (提到了几种调查的方向)
- SQL2008 未能为执行并行查询启动必要的线程资源-百度经验 (baidu.com) (排查了几个问题,然后建议是不要超过逻辑CPU 的数量)
本文来自博客园,作者:77工作室,转载请注明原文链接:https://www.cnblogs.com/z7luv/p/15305726.html
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。



浙公网安备 33010602011771号