Sql-Server

SQL Server 未使用 OPTION(MAXDOP 20) 創建並行計劃

  • August 18, 2021

我們在具有 8 個套接字和 20 個處理器的 VM 上託管了一個 UAT3 伺服器,我們在具有相同配置的同一 VM 上託管了類似的 UAT2 伺服器。

我們在兩個伺服器上執行以下查詢

select recid from Table1 where nation='AE'

兩個伺服器都具有相同的數據和相同的結構。

UAT2 和 UAT3 具有並行度5 和最大並行度0的預設設置成本門檻值。

在 UAT2 伺服器並行處理正在發生。它需要 10 秒才能完成,但 UAT3 串列處理正在發生,因為它需要 3 分 30 秒。

我們比較了 UAT2 和 UAT3 伺服器配置都相同。不知道為什麼 SQL Server 在 UAT2 中選擇並行執行,而不是在 UAT3 中選擇並行執行。

下面是表定義

CREATE TABLE [dbo].[FKMB_CUSTOMER]( 
   [RECID] [nvarchar](64) NOT NULL, 
   [XMLRECORD] [xml] NULL, 
   [ALT_CUSTOMER] AS 
       ([dbo].[IX_CUSTOMER_ALT_CUSTOMER]([XMLRECORD])) 
       PERSISTED, 
   [SMS] AS 
       ([dbo].[IX_CUSTOMER_SMS_1]([XMLRECORD])) 
       PERSISTED, 
   CONSTRAINT [PK__FKMB_CUS__A9A5B3BB8FBCAAED] 
       PRIMARY KEY CLUSTERED ( [RECID] ASC )) 

下面是視圖

CREATE VIEW V_FKMB_CUSTOMER as 
SELECT 
   a.RECID, 
   a.XMLRECORD "THE_RECORD" ,
   a.XMLRECORD.value
       ('data(/row/c28)[1]', 'nvarchar(max)') "NATIONALITY" ,
   a.XMLRECORD.value
       ('data(/row/c189)[1]', 'nvarchar(max)') "AUDIT_DATE_TIME" 
FROM "FKMB_CUSTOMER" a  

是計劃。

我們嘗試使用OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))但沒有運氣。優化器仍在選擇串列執行計劃。

您從 UAT3 共享的執行計劃包含以下內容:

NonParallelPlanReason="CouldNotGenerateValidParallelPlan"

這意味著阻止優化器為此查詢創建並行執行計劃。

如果您在 UAT2 上獲得具有相同查詢的並行計劃,那麼這些環境之間肯定會有所不同。此處列出了禁止並行性的一些原因:

查詢處理架構指南 - 並行查詢處理

我會仔細看看這兩種環境之間有什麼不同(數據庫範圍配置、伺服器級別配置、T-SQL 程式碼和表/對象定義等)。

您的表定義在計算列中包含標量 T-SQL 函式。除非啟用跟踪標誌 176,否則這些函式會阻止並行性。

請參閱是否有辦法防止計算列中的標量 UDF 抑制並行性?

具有並行計劃的實例要麼沒有這些標量函式,要麼具有 TF 176。

也可以看看:

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