Sql-Server

MAXDOP 不工作?

  • March 20, 2015

我想MAXDOP在我的電腦上測試一下。所以我MAXDOP為特定查詢設置為 2。但是,當我在執行查詢時查看任務管理器中的邏輯處理器時,看起來它們都被使用了。我認為如果設置為 2,它只會使用 2 個邏輯處理器MAXDOP?有誰知道發生了什麼?請看下圖。

另一個問題是,DOP執行計劃返回的結果是 1。現在我知道設置MAXDOP並不意味著 SQL Server 將實際使用設置的數字。DOP然而,鑑於我的 4 個邏輯處理器似乎都被用於處理查詢,所以看到1就更加奇怪了。

這是我執行的查詢: 在此處輸入圖像描述

這就是我執行它時發生的事情(即看起來所有 4 個邏輯處理器都被用於執行查詢): 在此處輸入圖像描述

該查詢是一個非並行(串列)計劃,因此它肯定是在單個 SQL Server工作執行緒上從頭到尾執行,與單個 SQLOS調度程序相關聯。

從作業系統的角度來看,這個單執行緒預設還是受制於 Windows 的正常調度算法。我說“預設”是因為行為取決於CPU affinity mask的設置。

預設情況下,遮罩全為零,這意味著 Windows 可以選擇每個時間片在哪個物理執行單元(例如核心)上執行執行緒。當相關調度程序的 CPU 關聯遮罩設置為 1 時,調度程序始終綁定到特定的物理處理單元。

因此,以 100% 執行的 SQL Server 執行緒將傾向於在物理單元之間跳躍,從而導致“拖尾”模式。設置關聯遮罩後,您將看到活動中的明顯峰值,因為不允許 Windows 移動執行緒。

儘管如此,您在任務管理器中看到的模式並不是查看 SQL Server CPU 活動的好方法。SQL Server 不是執行查詢時執行的唯一程序 - 例如,您還會看到 SSMS 接收結果並將其寫入螢幕的 CPU 使用情況。

SQL Server 提供了一系列動態管理對象來查看調度程序、工作程序和執行緒等內容。還有更多用於查看目前會話、請求等的狀態。

如果您對這些概念不熟悉,請參閱 TechNet 文章SQL Server 批處理或任務計劃和相關內容。

另一個問題是,執行計劃返回的 DOP 說 1

查詢提示僅限制查詢可能使用的MAXDOP調度程序總數。在編譯時,優化器可以根據成本估算在串列計劃和並行計劃之間做出決定。對於一個非常簡單的SELECT查詢,例如問題中的查詢,優化器通常會選擇一個“平凡的”執行計劃,它從不使用並行性。

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