【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。