我想MAXDOP
在我的电脑上测试一下。所以我MAXDOP
为特定查询设置为 2。但是,当我在运行查询时查看任务管理器中的逻辑处理器时,看起来它们都被使用了。我认为如果设置为 2,它只会使用 2 个逻辑处理器MAXDOP
?有谁知道发生了什么?请看下图。
另一个问题是,DOP
执行计划返回的结果是 1。现在我知道设置MAXDOP
并不意味着 SQL Server 将实际使用设置的数字。DOP
然而,鉴于我的 4 个逻辑处理器似乎都被用于处理查询,所以看到1就更加奇怪了。
这是我运行的查询:
这就是我运行它时发生的事情(即看起来所有 4 个逻辑处理器都被用于运行查询):
该查询是一个非并行(串行)计划,因此它肯定是在单个 SQL Server工作线程上从头到尾执行,与单个 SQLOS调度程序相关联。
从操作系统的角度来看,这个单线程默认还是受制于 Windows 的正常调度算法。我说“默认”是因为行为取决于CPU affinity mask的设置。
默认情况下,掩码全为零,这意味着 Windows 可以选择每个时间片在哪个物理执行单元(例如核心)上运行线程。当相关调度程序的 CPU 关联掩码设置为 1 时,调度程序始终绑定到特定的物理处理单元。
因此,以 100% 运行的 SQL Server 线程将倾向于在物理单元之间跳跃,从而导致“拖尾”模式。设置关联掩码后,您将看到活动中的明显峰值,因为不允许 Windows 移动线程。
尽管如此,您在任务管理器中看到的模式并不是查看 SQL Server CPU 活动的好方法。SQL Server 不是执行查询时运行的唯一进程 - 例如,您还会看到 SSMS 接收结果并将其写入屏幕的 CPU 使用情况。
SQL Server 提供了一系列动态管理对象来查看调度程序、工作程序和线程等内容。还有更多用于查看当前会话、请求等的状态。
如果您对这些概念不熟悉,请参阅 TechNet 文章SQL Server 批处理或任务计划和相关内容。
查询提示仅限制查询可能使用的
MAXDOP
调度程序总数。在编译时,优化器可以根据成本估算在串行计划和并行计划之间做出决定。对于一个非常简单的SELECT
查询,例如问题中的查询,优化器通常会选择一个“平凡的”执行计划,它从不使用并行性。