如果标量值函数或任何用户定义函数的性能低于SP 为什么我们需要通过用户定义的函数而不是简单的SP?
答案 0 :(得分:1)
您使用的内容取决于要求。
函数(包括标量)可以在查询中使用并返回一组不同类型,而存储过程只能返回整数值而不能在其他查询中使用。
create function dbo.scalarfunc () returns varchar(20) as
begin
declare @somevalue varchar(20)
set @somevalue = (select top 1 name from master.sys.tables)
return @somevalue
end
go
select * from sys.tables
where name = dbo.scalarfunc()
使用SP
create procedure dbo.someproc as
begin
declare @somevalue varchar(20)
set @somevalue = (select top 1 name from master.sys.tables)
return @somevalue
end
go
declare @somespret varchar(20)
exec @somespret = dbo.someproc
这会导致返回NULL并显示以下消息
''someproc'过程试图返回NULL状态,即 不被允许。将返回状态0。'
并且proc返回一个整数
create procedure dbo.someproc as
begin
declare @somevalue int
set @somevalue = (select top 1 object_id from master.sys.tables)
return @somevalue
end
go
declare @somespret int
exec @somespret = dbo.someproc
select @somespret
这可以工作,但在查询中使用它
从sys.tables中选择* 其中name = dbo.someproc()
会产生消息
找不到列“dbo”或用户定义的函数或 聚合“dbo.someproc”,或名称不明确
答案 1 :(得分:1)
因为您可以从选择查询中调用标量值函数,例如。
select f1(name), f2(id) from users
在SP的情况下是不可能的
答案 2 :(得分:0)
UDF在JOIN或WHERE子句中使用时会引入严重的性能问题,并且查询会返回大量数据
SELECT A.*, B.*
FROM A
INNER JOIN B ON B.id = A.id AND B.ExtraCode = calculateExtraCode(A.Name)
因此,对于每个选定的行,将调用UDF,并且问题在于UDF调用引入的调用延迟。它只需通过提取内联SP或查询的UDF体来测试,就可以很容易地观察到差异。
但是如果查询返回少量数据,则将逻辑分成UDF是有意义的,因此主查询/ SP的代码将更加清晰。