【SQLServer】并行的保留线程和已使用线程

时间:2022-09-11 11:26:13

我们都知道SQL Server的并行执行。为了快速处理一个请求,SQL Server会使用多个线程来处理一个请求。并行执行涉及两个重要的参数设置:
·maxdop:最大并行度
·并行度的成本阈值:如果任何估计的查询计划成本超过此值,则SQL Server优化器将尝试使用并行。

现在,回到我们的话题:保留线程(Reserved threads)和已使用线程(Used threads)。

假设我提交了一个查询,评估出的成本已经超出了并行度的成本阈值。SQL Server决定使用并行执行该查询。在我的测试环境中,maxdop采用的是默认值。也就意味着SQL Server可以使用所有的处理器来执行并行操作。此外,我将并行度的成本阈值设置为0,这样所有的查询都可以使用并行操作(这里只是为了示例)。SQL Server和使用多线程执行任务,且这些任务运行在调度器(schedulers)上。

与许多其他资源一样,SQL Server也保留了线程。展示一下Adventure Works 2014数据库中以下查询的执行计划:

SELECT [SalesOrderID]
      ,[SalesOrderDetailID]
      ,[CarrierTrackingNumber]
      ,[OrderQty]
      ,[ProductID]
      ,[SpecialOfferID]
      ,[UnitPrice]
      ,[UnitPriceDiscount]
      ,[LineTotal]
      ,[rowguid]
      ,[ModifiedDate]
  FROM [AdventureWorks2014].[Sales].[SalesOrderDetail]
  ORDER BY ModifiedDate DESC

【SQLServer】并行的保留线程和已使用线程

现在可以右击select node,查看属性:

【SQLServer】并行的保留线程和已使用线程

在上面的属性中,可以看到SQL Server使用并行度为2。计算此执行的分支为1。保留线程数和已使用线程数为2。

请记住,保留或使用的线程数并不总是等于查询的MAXDOP值。我来给你展示一下:

Select SOD.SalesOrderID, SOD.UnitPrice, SOD.LineTotal,
SOH.TotalDue, SOH.DueDate, SOH.OrderDate
from [Sales].[SalesOrderDetail] SOD
inner join [Sales].[SalesOrderHeader] SOH
on sod.SalesOrderID=SOH.SalesOrderID
ORDER BY SOH.TotalDue DESC

【SQLServer】并行的保留线程和已使用线程

现在右击select node,查看属性:

【SQLServer】并行的保留线程和已使用线程

在上面的属性中,可以看到SQL Server使用了并行度4。这里执行的分支数是2。保留线程数和使用线程数是8。