MAXDOP = 1,查询提示和并行成本阈值

Mar*_*sey 11 sql-server optimization parallelism sql-server-2012 maxdop

如果实例MAXDOP设置为 1 并且查询提示用于允许特定查询并行执行,SQL 是否仍使用并行成本阈值值来决定是否实际并行执行?

我一直无法挖掘出这些特定信息,尽管此链接表明如果MAXDOP为 1 ,则 CTFP 将被忽略。这在没有查询提示的情况下是有意义的,因为没有请求,无论成本如何,当MAXDOP为 1时都会并行。

谁能让我知道这两个请求的预期行为是什么?

示例 1:

Instance Maxdop: 1 
CTFP: 50 
Query hint: Maxdop=2 
Query cost: 30
Run Code Online (Sandbox Code Playgroud)

示例 2:

Instance Maxdop: 1
CTFP: 50
Query hint: Maxdop=2
Query cost: 70
Run Code Online (Sandbox Code Playgroud)

Pau*_*ite 20

如果实例MAXDOP设置为 1 并且查询提示用于允许特定查询并行执行,SQL 是否仍使用并行成本阈值值来决定是否实际并行执行?

简单的回答:是的

细节

这里有几个单独的事情,重要的是要分开:

  1. 查询可用有效最大并行度是多少?

    对此的贡献者是(大致按重要性排序):

    • 资源调控器MAX_DOP设置
    • 查询提示MAXDOP设置
    • max degree of parallelism实例配置选项

    服务器的“最大并行度”设置、资源调控器的 MAX_DOP 和查询提示 MAXDOP中解释了详细信息——SQL Server 应该使用哪一个?作者:Jack Li,Microsoft SQL Server 客户服务和支持高级上报工程师。下表是从该链接复制的:

    并行表

  2. 查询计划会使用并行性吗?

    SQL Server 查询优化器总是首先找到串行计划*.

    那么,如果:

    • 进一步优化是合理的;
    • 最佳串行方案的成本超过cost threshold for parallelism配置值


    ...优化器将尝试找到一个并行计划。

    那么,如果:

    • 找到并行计划(即可能);
    • 并行计划的成本低于最佳串行计划


    ...将产生一个平行计划。

注:cost threshold for parallelism只影响是否优化查找一个并行计划。一旦并行计划被缓存,无论 CTFP 设置如何,它都会在重用时使用并行性执行(只要线程可用)。


例子

对于这两个示例,实例 maxdop 1 和查询提示 maxdop 2,有效可用 DOP为 2。如果选择并行计划,它将使用 DOP 2。

示例 1

假定 CTFP 为 50,最便宜的串行计划发现成本为 30,SQL Server 将不会尝试寻找并行计划。将产生一个系列计划。

示例 2

假设 CTFP 为 50,最便宜的串行计划成本为 70,SQL Server 将尝试找到并行计划。如果此计划(如果找到)的成本低于 70(串行计划成本),则将生成并行计划。


查询优化的最终结果始终是单个缓存计划:串行并行。只有优化查找一个串行计划搜索0(TP)和搜索1(QP)阶段。

然后它可以(如所述)重新运行search1并要求生成并行计划。然后根据迄今为止的最佳整体计划成本在串行和并行之间做出选择。如果优化转移到search2(完全优化),则该选择具有约束力。优化的每个阶段都会考虑许多备选方案,但一个阶段的输出始终是一个最佳计划,可以是串行的或并行的。

我在Myth: SQL Server Caches a Serial Plan with every Parallel Plan 中写到了其中的一些内容