UDF внутри проблемы производительности SP на MS SQL - PullRequest
3 голосов
/ 25 апреля 2011

У меня есть следующий 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

У меня такой вопрос: у вызова UDF из SP есть проблемы с производительностью? Есть ли лучший способ добиться такой же функциональности?

Спасибо за ваш совет ...

Ответы [ 2 ]

2 голосов
/ 25 апреля 2011

Да, это неправильное использование скалярных UDF.Это должно работать намного лучше.

SELECT 
      id,
      name,
      [begin],
      [end]
FROM 
      orders o
WHERE EXISTS(
            SELECT  *   
            FROM access         
            WHERE orderId = o.id AND [user] = @user AND role >= 1
           )

Некоторое обсуждение скалярных UDF и производительности здесь

0 голосов
/ 25 апреля 2011

Как всегда с вопросами о: производительности, профиле, профиле, профиле.

Кроме этого, единственная причина, по которой я вижу, что UDF вызовет какие-либо проблемы с производительностью, заключается в том, что он сам по себе является особенно неэффективным,Это должно быть не менее эффективно, чем вызов GetDate() в хранимых процессах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...