Sql-Server

為什麼我在實際查詢計劃中看到 OPTION (MAXDOP 1),即使我沒有在儲存過程中設置它?

  • June 30, 2016

SQL ServerMAXDOP 0預設設置為 。在我正在測試的儲存過程中,我一直WITH (MAXDOP 1)在實際執行計劃中看到,即使我沒有指定除SORT_IN_TEMPDB = 1. 主記憶體儲過程呼叫另一個獲取表的過程,在每個禁用的索引上生成腳本,然後執行該系列腳本(使用上述查詢提示)。有趣的是,我看到該操作的 CPU 成本很高,所以我認為並行性有好處。

該表有幾百萬行並且非常寬。

不幸的是,數據庫是文件,而 TempDB 文件位於同一個數據儲存上,而 TempDB 只是 1 個文件而不是多個文件。此配置超出我的控制範圍,但可能與沒有並行性的原因有關。

伺服器位於具有 4 個核心和 64 GB RAM 的 VM 上。

關於為什麼 SQL Server 堅持在大表上的如此大的操作上放棄並行性的任何想法?

編輯:為在 Upserts 期間呼叫的內部儲存過程添加了腳本:

CREATE PROCEDURE etl_Index_EnableDisable @DatabaseName NVARCHAR(50) ,@TableName NVARCHAR(50) ,@EnableDisable NVARCHAR(50)

AS BEGIN

IF @DatabaseName IS NULL
  RAISERROR('Null values not allowed for @DatabaseName', 16, 1)
IF @TableName IS NULL
  RAISERROR('Null values not allowed for @TableName', 16, 1)
IF @EnableDisable IS NULL
  RAISERROR('Null values not allowed for @EnableDisable', 16, 1)

DECLARE @SQL NVARCHAR(4000)

-- Interpret 1 as enable and 0 as disable. Also set to Upper case
SET @EnableDisable = CASE UPPER(@EnableDisable) WHEN '1' THEN 'ENABLE' 
                                                WHEN 'REBUILD' THEN 'ENABLE' 
                                                WHEN '0' THEN 'DISABLE' 
                                                ELSE UPPER(@EnableDisable) 
                     END


SET @SQL = ' DECLARE @SQLIn NVARCHAR(4000)  
             SELECT @SQLIn = COALESCE(@SQLIn,'' '') 
             +  SQL1 FROM ( (SELECT '' ALTER INDEX '' + si.name + '' ON ' + @DatabaseName + ' .dbo.'' + st.name + ' + CASE @EnableDisable WHEN 'DISABLE' THEN ''' DISABLE ''' 
                                                                                                                    WHEN 'ENABLE' THEN ''' REBUILD WITH (SORT_IN_TEMPDB = ON) ''' END + '
                AS SQL1
                 FROM ' + @DatabaseName + '.Sys.indexes si
                      JOIN  ' + @DatabaseName + '.Sys.tables st ON si.object_id = st.object_id
                 WHERE st.name = ''' + @TableName + '''
                       AND (si.is_unique = 0
                            AND si.is_unique = 0
                            AND si.is_primary_key = 0
                           AND si.[type] = 2
                           )
                      AND si.is_disabled = ' + CASE @EnableDisable WHEN 'DISABLE' THEN '0'
                                                                   WHEN 'ENABLE' THEN '1' 
                                               END + '
                      AND si.Name IS NOT NULL
              ) ) tb

            EXEC sp_sqlexec @SQLIn '

EXEC sp_sqlexec @SQL

結束`

您正在標準版上執行索引重建。

如此所述,您需要 Enterprise 或 Developer 版本才能看到此並行性。

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