Sql-Server

查詢執行時使用了多少個執行緒?

  • July 1, 2020

我在我的測試 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 個):

SSMS 執行計劃中的執行緒統計節點截圖

請注意,它對分支表示“2” - 這是可以同時執行的分支數。

為了解決您對活動工作人員的螢幕截圖,一些執行緒可能會在其他執行緒之前完成所有工作(例如,因為它們要處理的行較少)。因此,在查詢執行的給定點,您可能只有 6 個執行緒在執行(在 8 個可能的執行緒中)。

相關閱讀:

並行執行計劃——分支和執行緒

在 SQL Server 中,是每個運算符的並行性,還是其他?

引用自:https://dba.stackexchange.com/questions/270165