Sql-Server
SQL Server 未使用 OPTION(MAXDOP 20) 創建並行計劃
我們在具有 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,否則這些函式會阻止並行性。
具有並行計劃的實例要麼沒有這些標量函式,要麼具有 TF 176。
也可以看看: