我正在尝试更改当前设置为零的 Azure 托管 SQL 的 MAX DOP 值。这是我正在运行的脚本:
USE [my-sql-db]
GO
ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP =5 ;
该脚本工作正常并返回成功,但是当我运行时
SELECT value_in_use FROM sys.configurations WHERE name = 'max degree of parallelism'
我看到数字设置为零
当我运行时, select * from sys.dm_exec_query_memory_Grants
我可以看到该值设置为1。
但是当我检查 SSMS 中的数据库设置时,我可以看到 MAXDOP 的正确值
我想知道为什么当我检查 SSMS 中的数据库设置时与我检查sys.configurations
或时会得到冲突的数字sys.dm_exec_query_memory_Grants
?
给定查询执行的 MAXDOP 在运行时协商,考虑到许多因素。
2013 年的这篇文章给出了当时涉及的具体细节。
工作原理:最大化最大并行度 (MAXDOP)
由于撰写了该文章,因此添加了 MAXDOP 的数据库范围配置设置。它不会替换 sys.configurations 中的设置,后者可以通过 SSMS 中的 UI 或通过 sp_configure 进行设置。相反,它是对给定查询影响 MAXDOP 的另一层。不应期望设置数据库范围的配置 MAXDOP 选项会更改存储在实例范围的 MAXDOP 设置中的值。
不管通过评估其层次结构内的 MAXDOP 系统设置和对查询执行的适用性确定的 MAXDOP 候选者如何,都存在可能确定执行 DOP 的额外查询和运行时注意事项。
例如,使用非内联标量用户定义函数可能会导致串行计划而不是并行(或至少是串行计划区域)。
影响 DOP 的运行时因素之一是“Max Workers Count”,其中当前执行上下文 ID 为 0 工作人员、当前保留的并行工作人员和所需的并行工作人员保留。如果所需的并行工作人员预留将使该总和超过“最大工作人员计数”,则候选 DOP 将降级,直到所需的预留符合“最大工作人员数量”。
允许的内存授予还可以减少查询的候选 DOP。我最常看到这种情况,而且可能只在列存储批量插入中看到——如果我想要 DOP 8,但优化器估计查询执行的允许内存授予太小而无法很好地执行批量插入,候选的 dop 将会降低。
当然,在选择查询计划时,如果成本低于并行计划成本,则可以选择串行查询计划而不是并行计划。
但是……如果成本太低就不行。有一个实例范围的设置“Parallelim 的成本阈值”。默认 CTFP 为 5。如果串行计划的成本低于 CTFP,则不会选择并行计划(不受 ENABLE_PARALLEL_PLAN_PREFERENCE 提示之类的影响)。
除了 sqL_handle 所说的,你正在运行
ALTER DATABASE SCOPED CONFIGURATION
,关键字是database。如果您阅读文档sys.configurations
,他们会说此系统视图“包含系统中每个服务器范围的配置选项值的一行。 ”所以简而言之,它们是您正在比较的两个不同的配置选项,数据库与服务器。