MAXDOP 不工作?

use*_*285 7 sql-server parallelism maxdop sql-server-2014

我想MAXDOP在我的电脑上测试一下。所以我MAXDOP为特定查询设置为 2。但是,当我在运行查询时查看任务管理器中的逻辑处理器时,看起来它们都被使用了。我认为如果MAXDOP设置为 2 ,它只会使用 2 个逻辑处理器?有谁知道发生了什么?请看下图。

另一个问题是,DOP执行计划返回的值是1。现在我知道设置MAXDOP并不意味着SQL Server 会实际使用设置的数字。然而,考虑到我的 4 个逻辑处理器似乎都被用于处理查询,看到DOP1.

这是我运行的查询: 在此处输入图片说明

这是我运行时发生的情况(即看起来所有 4 个逻辑处理器都用于运行查询): 在此处输入图片说明

Pau*_*ite 19

该查询是一个非并行(串行)计划,因此它肯定是在与单个 SQLOS调度程序关联的单个 SQL Server工作线程上从头到尾执行的。

从操作系统的角度来看,这个单线程在默认情况下仍然受制于 Windows 的正常调度算法。我说“默认”是因为行为取决于CPU 关联掩码的设置。

默认情况下,掩码全为零,这意味着 Windows 可以选择每个时间片在哪个物理执行单元(例如核心)上运行线程。当相关调度器的 CPU 关联掩码设置为 1 时,调度器始终绑定到特定的物理处理单元。

因此,以 100% 运行的 SQL Server 线程将倾向于在物理单元周围跳跃,从而导致“涂抹”模式。设置关联掩码后,您将看到活动中更清晰的峰值,因为不允许 Windows 移动线程。

尽管如此,您在任务管理器中看到的模式并不是查看 SQL Server 的 CPU 活动的好方法。SQL Server 不是查询执行时运行的唯一进程 - 例如,您还可以通过 SSMS 接收结果并将其写入屏幕来查看 CPU 使用情况。

SQL Server 提供了一系列动态管理对象来查看调度程序、工作线程和线程等内容。还有更多用于查看当前会话、请求等的状态。

如果您对这些概念不熟悉,请参阅 TechNet 文章、SQL Server 批处理或任务调度和相关内容。

另一个问题是,执行计划返回的DOP表示1

MAXDOP查询提示仅限制调度的查询可以使用的总数。在编译时,优化器可以根据成本估计在串行和并行计划之间做出决定。对于非常简单的SELECT查询,例如问题中的查询,优化器通常会选择一个“平凡”的执行计划,它从不使用并行性。