我有以下SP
PROCEDURE [dbo].[order_s]
(
@user Uniqueidentifier
)
AS
BEGIN
SET NOCOUNT ON;
SELECT
id,
name,
[begin],
[end]
FROM
orders
WHERE
@user = dbo.hasAccess(@user,id,'select')
END
此SP调用此UDF
FUNCTION [dbo].[hasAccess]
(
@user uniqueidentifier,
@orderId bigint,
@AccessType nchar(10)
)
RETURNS uniqueidentifier
AS
BEGIN
DECLARE @Result uniqueidentifier
SELECT
Top 1 @Result = [user]
FROM
access
WHERE
orderId = @orderId AND
[user] = @user AND
role >= CASE
WHEN @AccessType = 'select' then 1
WHEN @AccessType = 'insert' then 5
WHEN @AccessType = 'update' then 7
WHEN @AccessType = 'delete' then 10
END
RETURN @Result
END
我的问题是,从SP调用UDF有任何性能问题吗? 有没有更好的方法来实现相同的功能?
感谢您的建议......
答案 0 :(得分:2)
是的,这是对标量UDF的错误使用。这应该会好得多。
SELECT
id,
name,
[begin],
[end]
FROM
orders o
WHERE EXISTS(
SELECT *
FROM access
WHERE orderId = o.id AND [user] = @user AND role >= 1
)
答案 1 :(得分:0)
与问题一样:性能 - 个人资料,个人资料,个人资料。
除此之外,我可以看到UDF会导致任何性能问题的唯一原因是它本身的效率特别低。它应该不比在存储过程中调用GetDate()
效率低。