我目前正在阅读一本关于SQL Server 2014的书.它声称,用户定义的标量值函数防止了它们出现的整个计划的并行性.在以后的版本中,这一点仍然成立吗?
我目前正在阅读一本关于SQL Server 2014的书.它声称,用户定义的标量值函数防止了它们出现的整个计划的并行性.在以后的版本中,这一点仍然成立吗?
如果函数不是内联的,它仍然会阻止并行性.
TSQLUserDefinedFunctionsNotParallelizable
still exists在2022年执行计划中作为NonParallelPlanReason
.
如果函数是内联的,则查询可以并行执行.
这here人中就有一个例子
以下是上述计划中的一些关键观察结果.SQL Server是 现在,在所有运算符之间使用并行性.
标量函数内联自SQL Server 2019以来一直可用,但只有一些函数符合这一标准,并且在实现该功能时出现了一些问题,这意味着可以内联的标准为has become more strict.
如果表中的计算列引用标量UDF,则无论UDF是否可以内联,这都会阻止并行化.
DROP TABLE IF EXISTS dbo.T
GO
CREATE OR ALTER FUNCTION dbo.F1()
RETURNS INT
WITH INLINE = ON
AS
BEGIN
RETURN 1;
END;
GO
CREATE TABLE dbo.T
(
A INT
)
GO
--Parallel plan
SELECT SUM(dbo.F1())
from dbo.T t1 join dbo.T t2 ON t1.A = t2.A
option (use hint('enable_parallel_plan_preference'))
GO
--Add computed column referencing the function
ALTER TABLE dbo.T ADD B AS dbo.F1()
GO
--Rerun the query. Now serial with "CouldNotGenerateValidParallelPlan" reason in 2019 and "TSQLUserDefinedFunctionsNotParallelizable" in 2022
SELECT SUM(dbo.F1())
from dbo.T t1 join dbo.T t2 ON t1.A = t2.A
option (use hint('enable_parallel_plan_preference'))