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'))但没有运气。优化器仍然选择串行执行计划。
您从 UAT3 共享的执行计划中包含以下内容:
NonParallelPlanReason="CouldNotGenerateValidParallelPlan"
Run Code Online (Sandbox Code Playgroud)
这意味着优化器无法为此查询创建并行执行计划。
如果您使用相同的查询在 UAT2 上获得并行计划,那么这些环境之间一定会有一些不同。此处列出了禁止并行性的一些原因:
我会仔细看看这两种环境(数据库范围配置、服务器级别配置、T-SQL 代码和表/对象定义等)之间有什么不同。
您的表定义包括计算列中的标量 T-SQL 函数。除非启用跟踪标志 176,否则这些函数会阻止并行。
具有并行计划的实例要么不具有这些标量函数,要么具有 TF 176。
也可以看看: