如果这是一个愚蠢的问题,我们深表歉意。我们正在尝试将我们的多语句表值函数 (MSTVF) 转换为内联表值函数 (ITVF),以避免查询的强制序列化。
我有以下 ITVF 函数(淡化),但执行计划仍然说它的并行度为 1。实际有问题的函数有三个基本的 SELECT 语句,由 UNION ALL 分隔。
我错过了什么吗?我怎样才能在这里避免强制序列化?
CREATE FUNCTION dbo.Test (@i int)
RETURNS TABLE
AS
RETURN
SELECT @i as [i];
GO
SELECT * FROM dbo.Test (2);
GO
https://www.brentozar.com/pastetheplan/?id=Hyn8o50D7
该实例具有以下设置:
- 并行度的成本阈值 = 5
- 最大并行度 = 0
很简单,您的查询没有足够高的预估费用。
SQL Server 估计一个查询将花费多少精力,并将这个没有单位的度量显示为估计成本。如果它低于并行度的成本阈值,那么 SQL Server 将不会为并行计划操心。您的计划的估计成本为 0.129,因为它小于 5,这意味着没有并行性。
在您的计划 XML 中还有此查询仅花费 1 毫秒的详细信息。您无需并行。没有足够的工作来证明跨多个线程分配工作量的开销是合理的。
作为这个问题早期版本的旁白,如果估计的成本足够高并且满足所有其他并行条件,即使是 TRIVIAL 的查询也会并行。
NonParallelPlanReason="CouldNotGenerateValidParallelPlan"
在计划 XML 中有一种方法可以证明某些东西正在阻止并行性 。另一种测试方法(我假设你使用的是 SQL Server 2014,因为 2016 有一个实际的提示要使用)是添加
OPTION(QUERYTRACEON 8649)
到你的查询中。不过,请仅将其用于测试,因为将未记录的跟踪标志添加到生产代码中确实很愚蠢,并不是一件好事。