为什么简单的T-SQL UDF函数会使代码执行慢3倍
技术问答
214 人阅读
|
0 人回复
|
2023-09-14
|
我正在重写一些旧的存储过程,并且在使用函数而不是内联代码时遇到了意外的性能问题。- I, ?' f0 ~2 B2 C- _
该功能非常简单,如下所示:
( l* ?. ~. C3 p8 KALTER FUNCTION [dbo].[GetDateDifferenceInDays] ( S& G Y5 M; R2 a' A
( % r: U2 U4 w+ a
@first_date SMALLDATETIME, 4 ]1 n- z( O, W! U5 T9 \4 x; x, \2 \
@second_date SMALLDATETIME# y+ ?7 O5 k F) ~. w( v
)
) _3 X( ~2 w9 `$ |# v- lRETURNS INT $ P6 a8 C" S0 W5 A/ z% a9 @
AS
: E: e. {( O e9 A4 @# EBEGIN
+ v0 C7 J: {$ H* SRETURN ABS(DATEDIFF(DAY, @first_date, @second_date))! V8 V1 `" H e f" L% ?
END
4 [: N/ ]) v8 {$ s0 C( n3 E f因此,我有两个相同的查询,但是一个使用该函数,另一个使用查询本身进行计算:2 A- Z5 X8 E& [; B# A: p
ABS(DATEDIFF(DAY, [mytable].first_date, [mytable].second_date))
& A8 c/ J* F1 Y+ L3 Y$ c% ^! P" p# f现在,使用内联代码的查询运行速度比使用该函数的查询快3倍。: R, ^5 j; t7 t' c! c: z
; p& A4 h, i9 z4 j& x, x, M% g! H
解决方案:3 L; G: F( M8 a9 { e" f5 J" ^
' s1 V% l4 B& g) b2 F5 o5 } J4 _( }
U% w: Z& D- ?. \/ U
您拥有的是一个标量UDF(接受0到n个参数并返回一个标量值)。除非使用常量参数调用,否则此类UDF通常会导致查询的逐行操作,从而导致查询性能下降。
, l3 A' a! K7 V4 \5 L- ?有关使用UDF的性能陷阱的详细说明,请参见此处,
8 c& V. R0 E# ^) w此处和此处。 |
|
|
|
|
|