我对MAXDOP到底做了什么感到困惑。我读到它将SQL查询限制为在MAXDOP指定的处理器数量上运行;在其他文章中,他们说MAXDOP限制了查询中操作符所受的处理器数量的约束。
如果我有一个有4个CPU的系统,并且我将MAXDOP设置为2,然后运行一个简单的查询,该查询将有两个并行的索引扫描,我可以看到我最终得到了5个线程。
由于MAXDOP设置,这5个线程是否会被限制为只能在2个CPU上运行?
发布于 2016-09-29 20:40:26
MAXDOP提示限制每个并行操作符使用的线程数和查询计划中所有并行操作符使用的逻辑CPU总数。This post对此进行了更详细的解释。
使用您的问题中提到的2个并行索引扫描,每个并行扫描被限制为2个线程,总共4个并行线程。这些并行线程的任务共享MAXDOP数字指定的相同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;https://stackoverflow.com/questions/39767157
复制相似问题