【SQLServer】並行的保留執行緒和已使用執行緒

我們都知道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

現在可以右擊select node,查看屬性:

在上面的屬性中,可以看到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

現在右擊select node,查看屬性:

在上面的屬性中,可以看到SQL Server使用了並行度4。這裡執行的分支數是2。保留執行緒數和使用執行緒數是8。

Tags: