并行度

SQL Server 自动检测每个并行查询执行或索引数据定义语言 (DDL) 操作实例的最佳并行度。此操作所依据的条件如下:

  1. SQL Server 是否运行在具有多个微处理器或 CPU 的计算机(例如对称多处理计算机,即 SMP)上。

    只有具有多个 CPU 的计算机才能使用并行查询。

  2. 可用的线程是否足够。

    每个查询或索引操作均要求一定线程数才能执行。执行并行计划比执行串行计划需要更多的线程,所需线程数会随着并行度的提高而增加。当无法满足特定并行度的并行计划的线程要求时,数据库引擎将自动减少并行度或完全放弃指定的工作负荷上下文中的并行计划。然后执行串行计划(一个线程)。

  3. 所执行的查询或索引操作的类型。

    创建索引、重新生成索引或删除聚集索引等索引操作,以及大量占用 CPU 周期的查询最适合采用并行计划。例如,大型表的联接、大型的聚合和大型结果集的排序等都很适合采用并行计划。对于简单查询(常用于事务处理应用程序)而言,执行并行查询所需的额外协调工作会大于潜在的性能提升。为了区别能够从并行计划中受益的查询和不能从中受益的查询,数据库引擎将执行查询或索引操作的估计开销与并行的开销阈值进行比较。虽然不推荐,但用户可以使用 sp_configure 更改默认值 5。

  4. 待处理的行数是否足够。

    如果查询优化器确定行数太少,则不引入交换运算符来分发行。结果,运算符将串行执行。以串行计划执行运算符可避免出现这样的情况:启动、分发和协调的开销超过并行执行运算符所获得的收益。

  5. 当前的分发内容统计信息是否可用。

    如果不能达到最高并行度,则在放弃并行计划之前会考虑较低的并行度。

    例如,创建视图的聚集索引后,将无法评估分发内容统计信息,因为聚集索引仍不存在。在此情况下,数据库引擎无法为索引操作提供最高并行度。不过,某些运算符(例如,排序和扫描)仍能从并行执行中获益。

注意注意

并行索引操作只能在 SQL Server Enterprise Edition、Developer Edition 和 Evaluation Edition 中使用。

执行时,数据库引擎将确定当前系统工作负荷和前面介绍的配置信息是否允许并行执行。如果可以确保并行执行,则数据库引擎将确定最佳线程数,并在这些线程间分配并行计划的执行。从查询或索引操作开始在多线程上并行执行起,将一直使用相同的线程数,直到操作完成。每次从过程缓存中检索执行计划时,数据库引擎都将重新检查最佳线程数决策。例如,第一次执行某个查询时最终采用了串行计划,后来第二次执行相同的查询将使用三个线程的并行计划,第三次执行将使用四个线程的并行计划。

在并行查询执行计划中,插入、更新和删除运算符是串行执行的。不过,UPDATE 或 DELETE 语句的 WHERE 子句,或者 INSERT 语句的 SELECT 部分可以并行执行。之后,实际的数据更改将串行应用到数据库。

并行执行计划可以填充静态和由键集驱动的游标。然而,只有串行执行可以提供动态游标行为。查询优化器始终为查询生成串行执行计划,这是动态游标的一部分。

覆盖并行度

您可以使用 max degree of parallelism 服务器配置选项来限制在并行计划执行中使用的处理器数。通过指定 MAXDOP 查询提示或 MAXDOP 索引选项,可以用单独查询和索引操作语句来覆盖 max degree of parallelism 选项。MAXDOP 提供对单独查询和索引操作的详细控制。例如,您可以使用 MAXDOP 选项来控制(扩展或减少)联机索引操作的专用处理器数。通过这种方式,您就可以在并发用户间平衡索引操作所使用的资源。若将 max degree of parallelism 选项设置为 0,SQL Server 将能够在并行计划执行中使用全部最多 64 个可用的处理器。若对于查询和索引将 MAXDOP 设置为 0,SQL Server 将可为并行计划执行中的给定查询或索引使用全部最多 64 个可用的处理器。