坑系列 (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,问题解决。

回顾追溯问题原因的过程:

  1. 在排查后台相关方法逻辑没有问题的前提下,贴出拼接的sql语句,发现有可能是sql 的问题。
  2. 查看出问题的sql 的执行计划,发现是并行查询。对于SQL Server 来说,最终的执行计划是需要多方面评估决定的结果,同时还会参照当前运行的硬件资源,遇到的问题有可能是某些硬件不支持,比如: 内存限制、CPU限制、IO瓶颈等。
  3. 排除了硬件资源的限制,发现SQL Server 在处理某个数据集比较大,耗费资源比较多的时候,会采用并行的方法,把数据集拆分成若干个,若干个线程同时处理,来提高整体效率。当前的报错也是无法提供额外的线程资源,由此问题原因归咎于最大并行度。
  4. MaxDOP 设置成1 的原因是,处理的任务只会由一个线程来处理,所以就不会有线程资源不够用的错误报出。

围绕这个问题其实涉及到了一些知识点,简要总结如下:

  1. 并行 -> 参考另一篇文章:https://www.cnblogs.com/z7luv/p/15305724.html
  2. 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)设置为较高的,这样的话,不是所有的查询都有资格使用并行,除了那些查询成本较高的查询。

 

 

 


参考链接:

   

(The query processor could not start the necessary thread resources for parallel query execution.)

posted @ 2021-10-12 11:13  77工作室  阅读(2877)  评论(0编辑  收藏  举报