我对MAXDOP实际上做了什么很困惑。我已经读过,它限制了一个SQL查询在MAXDOP指定的处理器数量上运行;在其他文章中,他们说MAXDOP约束了查询中的运算符受到约束的处理器数量。
如果我有一个带有4个CPU的系统并且我将MAXDOP设置为2,那么运行一个简单的查询,它将有两个并行化的索引扫描,我可以看到我最终有5个线程。
由于MAXDOP设置,这5个线程是否被限制为仅在2个CPU上运行?
答案 0 :(得分:3)
MAXDOP提示限制每个并行运算符使用的线程数以及查询计划中所有并行运算符使用的逻辑CPU总数。 This post更详细地解释了这一点。
通过问题中提到的2个并行索引扫描,每个并行扫描限制为2个线程,总共4个并行线程。这些并行线程的任务共享与MAXDOP编号指定的CPU相同的CPU。一次只能在同一个CPU上激活1个工作器,因此在任何给定时间实际用于并行操作的CPU总数受MAXDOP限制。但是你也会有其他计划操作符的另一个线程,它不被认为是MAXDOP的一部分,因此查询可能同时使用多达3个核心。
在查询执行期间运行此查询,您应该看到一次在给定的调度程序上运行的任务不超过一个:
SELECT ost.session_id
, ost.scheduler_id
, w.worker_address
, ost.task_state
, wt.wait_type
, wt.wait_duration_ms
FROM sys.dm_os_tasks ost
LEFT JOIN sys.dm_os_workers w ON ost.worker_address = w.worker_address
LEFT JOIN sys.dm_os_waiting_tasks wt ON w.task_address = wt.waiting_task_address
WHERE ost.session_id = 54
ORDER BY scheduler_id;