我对 SQL Server 线程的理解是,SQL Server 将会话中的执行请求分解为多个任务,并将每个任务与一个工作线程相关联。因此 SQL Server 总是尝试使用多个线程(如果可用且需要)来运行查询,无论它是并行查询还是非并行查询。
但是以下语句(来自 Microsoft SQL Server 2012 Internals (MS Press) 一书)似乎陈述了一些不同的内容:
一个并行查询执行计划可以使用多个线程;非并行查询使用的串行执行计划仅使用单个线程。
编辑:我最初的理解是(可能不正确)调度程序可能(在需要时)使用来自同一个 NUMA 节点的多个工作人员/线程来处理同一执行请求的不同任务,当它是串行执行时。
对于并行执行,多个调度程序/处理器将同时处理相同的执行请求(分解为多个任务),并且每个调度程序将使用(再次,当需要时)来自它们各自的 NUMA 节点。
换句话说,无论是否并行,都有可能使用多个线程。
明明我原来的理解肯定有瑕疵,但不知道错在哪里。我最初的理解是否仅在执行PARALLEL查询时适用?
谢谢
串行计划不会使用多个线程,它只会使用单个线程来执行任务。当串行查询开始时,它将绑定到调度程序,并且该调度程序将不会执行任何其他任务,除非它完成此查询。调度程序可能会等待进程完成,从而迫使查询等待。
还值得注意的是,MAXDOP 设置控制用于并行处理的线程数量,并且始终在执行计划中为每个运算符指定 MAXDOP,而不是每个执行计划
我强烈建议您阅读以下 Paul White 的文章
了解和使用 SQL Server 中的并行性