在ms sql上的SP性能问题中的UDF

时间:2011-04-25 16:38:18

标签: sql sql-server tsql

我有以下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有任何性能问题吗? 有没有更好的方法来实现相同的功能?

感谢您的建议......

2 个答案:

答案 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
           )

Some discussion on Scalar UDFs and performance here

答案 1 :(得分:0)

与问题一样:性能 - 个人资料,个人资料,个人资料。

除此之外,我可以看到UDF会导致任何性能问题的唯一原因是它本身的效率特别低。它应该不比在存储过程中调用GetDate()效率低。