我目前正在阅读一本关于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'))

enter image description here

Sql相关问答推荐

如何重用表值用户定义函数调用的结果?

Postgres JSONB对象筛选

如何在presto/SQL中使用两个数组列创建(分解)单独的行

使用多个嵌套数组查询JSON数据

PostgreSQL:查找继承表中的特定记录属于哪个表

改进的SQL子字符串提取

计算不同模式的时间跨度

Postgres,使用 select 插入多个值

汇总具有连续日期范围的行

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

如何在sparksql查询中使用日期值?

在没有订单的情况下,如何生成一个值为0的顾客天数行

如何创建一个递归计数器来查找一个元素有多少父级和子级?

带有数组输入参数的Snowflake UDF优化

基于字符串的SQL查询

根据潜在空值的条件对记录进行计数

如何根据某个值在where子句中添加某个条件

SQL Server 查找存在于所有不同时期(或序列)中的条目

忽略与给定列匹配的行的 LAG 函数

使用 R 遍历 SQL 查询,每次替换一个变量