为什么一个简单的T-SQL UDF功能,使代码执行3次慢(Why a simple T-SQL UD

2019-07-31 15:44发布

我重写一些旧的存储过程,我已经使用功能,而不是内嵌代码时遇到意想不到的性能问题。

该函数为非常简单:

ALTER FUNCTION [dbo].[GetDateDifferenceInDays] 
(       
@first_date SMALLDATETIME, 
@second_date SMALLDATETIME
)
RETURNS INT 
AS
BEGIN 

RETURN ABS(DATEDIFF(DAY, @first_date, @second_date))

END

所以,我有两个相同的查询,但有使用功能,另一种则在查询本身的计算:

ABS(DATEDIFF(DAY, [mytable].first_date, [mytable].second_date))

现在有了内嵌代码的查询运行比使用该函数的一个快3倍。

Answer 1:

你有什么是标量UDF(取0到n参数和返回标量值)。 这样的UDF通常会导致您的查询的行由行操作,除非称为恒定参数,与正是你与你的查询体验那种性能下降。

见这里 , 这里和这里的UDF的使用的peformance缺陷的详细说明。



Answer 2:

不要使用慢速标量UDF,使用快速内嵌一个。 例如在这里:

重用代码与表值的UDF

计算第三个星期三每月的内联的UDF

许多嵌套内联UDF是非常快

现在的问题是很常见的:它已经被问和回答过上百次,因此它有几个罐头的答案。



Answer 3:

根据不同的使用情况下,查询优化器可能能够分析内嵌代码,并找出一个伟大的使用索引查询计划,虽然它没有“内联函数”为类似的详细分析,并因此与劣势查询结束当涉及到的功能规划。 并排看两个查询计划,一边,你就应该能够确认(或否定)这个假设很容易!



文章来源: Why a simple T-SQL UDF function makes the code execution 3 times slower