SQL Server 不使用 OPTION(MAXDOP 20)创建并行计划

1 sql-server parallelism execution-plan query-performance

我们在具有 8 个套接字和 20 个处理器的 VM 上托管了一个 UAT3 服务器,我们在具有相同配置的同一 VM 上托管了类似的 UAT2 服务器。

我们在两个服务器上运行以下查询

select recid from Table1 where nation='AE'
Run Code Online (Sandbox Code Playgroud)

两个服务器具有相同的数据和相同的结构。

UAT2 和 UAT3 具有默认设置并行5 和最大并行度的成本阈值0。

IN UAT2 服务器并行处理正在发生。它需要 10 秒才能完成,但 UAT3 串行处理正在发生,因为它需要 3 分 30 秒。

我们比较 UAT2 和 UAT3 服务器配置都相同。不知道为什么 SQL Server 在 UAT2 中选择并行执行而不是在 UAT3 中。

下面是表定义

select recid from Table1 where nation='AE'
Run Code Online (Sandbox Code Playgroud)

下面是视图

CREATE TABLE [dbo].[FKMB_CUSTOMER]( 
    [RECID] [nvarchar](64) NOT NULL, 
    [XMLRECORD] [xml] NULL, 
    [ALT_CUSTOMER] AS 
        ([dbo].[IX_CUSTOMER_ALT_CUSTOMER]([XMLRECORD])) 
        PERSISTED, 
    [SMS] AS 
        ([dbo].[IX_CUSTOMER_SMS_1]([XMLRECORD])) 
        PERSISTED, 
    CONSTRAINT [PK__FKMB_CUS__A9A5B3BB8FBCAAED] 
        PRIMARY KEY CLUSTERED ( [RECID] ASC )) 
Run Code Online (Sandbox Code Playgroud)

是计划。

我们尝试使用OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))但没有运气。优化器仍然选择串行执行计划。

Jos*_*ell 6

您从 UAT3 共享的执行计划中包含以下内容:

NonParallelPlanReason="CouldNotGenerateValidParallelPlan"
Run Code Online (Sandbox Code Playgroud)

这意味着优化器无法为此查询创建并行执行计划。

如果您使用相同的查询在 UAT2 上获得并行计划,那么这些环境之间一定会有一些不同。此处列出了禁止并行性的一些原因:

查询处理架构指南 - 并行查询处理

我会仔细看看这两种环境(数据库范围配置、服务器级别配置、T-SQL 代码和表/对象定义等)之间有什么不同。


Pau*_*ite 5

您的表定义包括计算列中的标量 T-SQL 函数。除非启用跟踪标志 176,否则这些函数会阻止并行。

请参阅是否有办法防止计算列中的标量 UDF 抑制并行性?

具有并行计划的实例要么不具有这些标量函数,要么具有 TF 176。

也可以看看: