查詢執行時使用了多少個執行緒?
我在我的測試 SQL Server 2014 上安裝了 AdventureWorks2014 數據庫。我計劃執行以下查詢:
SELECT * FROM Sales.SalesOrderDetail sod INNER JOIN Production.Product p ON sod.ProductID = p.ProductID ORDER BY Style
在實際執行它之前,我有以下工作執行緒的圖片:
在執行查詢時,我再次檢查了工作執行緒的狀態:
如您所見,第二張圖片中的總 active_workers_count 高於第一張截圖中的。從第二個螢幕截圖中,我可以假設查詢執行所需的工作執行緒總數為 1+2+1+2=6。但是,當我查看執行計劃中索引掃描運算符的屬性時,我看到:
看來我的並行度是 4,這意味著 4 個執行緒正在並行處理行。
我很困惑,無法確定在查詢執行期間執行了多少執行緒。有人可以向我解釋為什麼 active_workers_count 與 DOP 不同嗎?
我很困惑,無法確定在查詢執行期間執行了多少執行緒。
要理解這一點,您確實需要查看執行計劃。這是我在 DOP 4(在 SQL Server 2014 兼容模式下)在 SQL Server 2017 上的查詢得到的結果:
每個並行分支都獲得 DOP 執行緒。因此,乍一看,最多有 12 個工作人員可以同時參與此查詢。
但是,雜湊匹配連接必須在啟動探測(下)輸入分支之前消耗整個建構(上)輸入分支。所以這裡是執行的方式,一般來說:
- 4 個工作執行緒開始執行紅色分支(請記住,執行從查詢計劃的左上角開始)
- 雜湊匹配請求來自黑色分支的行
- 4 個工作執行緒開始執行黑色分支(現在最多 8 個工作執行緒處於活動狀態)
- 一旦黑色分支完成,執行計劃的探測端就被啟動
- 黑色分支使用的 4 個工作執行緒被藍色分支重用(仍然最多 8 個活動工作執行緒)
因此,此查詢一次最多使用 8 個並行工作執行緒。 SQL Server 足夠聰明地意識到一次只能啟動兩個分支(因為雜湊匹配的阻塞性質),並且只保留 8 個執行緒(而不是 12 個):
請注意,它對分支表示“2” - 這是可以同時執行的分支數。
為了解決您對活動工作人員的螢幕截圖,一些執行緒可能會在其他執行緒之前完成所有工作(例如,因為它們要處理的行較少)。因此,在查詢執行的給定點,您可能只有 6 個執行緒在執行(在 8 個可能的執行緒中)。
相關閱讀: