Sql-Server
為什麼我在實際查詢計劃中看到 OPTION (MAXDOP 1),即使我沒有在儲存過程中設置它?
SQL Server
MAXDOP 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 版本才能看到此並行性。