在这里继续我的另一个问题,我想要一种简单的方法来形象化答案。
我试过使用这样的查询,但“运行”线程的数量有时会超过 DOP。
SELECT ost.session_id,
ost.exec_context_id,
ost.scheduler_id,
qp.node_id,
w.worker_address,
qp.physical_operator_name,
ost.task_state,
qp.row_count
FROM sys.dm_os_tasks AS ost
JOIN sys.dm_os_workers AS w
ON ost.worker_address = w.worker_address
LEFT JOIN sys.dm_exec_query_profiles AS qp
ON w.task_address = qp.task_address
WHERE ost.session_id = 57
AND ost.task_state = 'RUNNING'
ORDER BY ost.exec_context_id, ost.scheduler_id, qp.node_id, w.worker_address;
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用query_thread_profile扩展事件,但是对于具有多个并行分支的计划,它显示了相同的 N 个线程 ID。这似乎与给出的答案相反,因为 DOP 没有明确限制使用的线程总数。对于以 DOP 4 运行的查询,它看起来像这样。我确信相同的四个线程(加上协调器)不会用于所有分支和运算符。
因此,在 DOP 8 上运行这样的查询会给我三个并行分支。
SELECT COUNT(DISTINCT t1.Data)
FROM dbo.t1
JOIN dbo.t2
ON t1.Id = t2.f_Id
JOIN t3
ON …Run Code Online (Sandbox Code Playgroud) 以有效并行度 运行的 SQL Server 查询是否有可能x将并行工作器分配给多个x不同的调度程序?即使执行计划有许多并行区域?
我在测试 SQL Server 2014 上安装了 AdventureWorks2014 数据库。我计划执行以下查询:
SELECT *
FROM Sales.SalesOrderDetail sod
INNER JOIN Production.Product p ON sod.ProductID = p.ProductID
ORDER BY Style
Run Code Online (Sandbox Code Playgroud)
在实际执行之前,我有我的工作线程的以下图片:
在查询执行时,我再次检查了工作线程的状态:
如您所见,第二张图片中的 active_workers_count 总数高于第一张屏幕截图中的总数。从第二个屏幕截图中,我可以假设查询执行所需的总工作线程为 1+2+1+2=6。但是,当我查看执行计划中索引扫描运算符的属性时,我看到:
似乎我的并行度为 4,这意味着 4 个线程正在并行处理行。
我很困惑,无法确定在查询执行期间运行了多少线程。有人可以向我解释为什么 active_workers_count 与 DOP 不同吗?
我有 8 个 CPU 的 SQL Server。最大工作线程设置为 850。最大 dop 为 8。并行性的成本线程保持为 50。
这意味着 sql server 会将高于成本阈值的查询分解为 8 个线程。由于每个线程都在一个 cpu 上运行,那么这是否意味着在当前运行的 8 个线程中至少有一个被释放之前,不允许其他用户运行查询?
那么设置 max dop = cpu 数量会导致单个查询阻塞其他查询的情况吗?