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