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

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

感谢您的建议...

最佳答案

是的,这是对标量 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

关于sql - ms sql 上 SP 性能问题中的 UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5780593/

相关文章:

mysql 数据透视表什么的

sql-server - 授予或撤销的权限 RECEIVE 与对象不兼容

sql - 使用外键,我可以在复合主键中引用固定值吗?

sql-server - 需要查询 - 确定每分钟的行数

sql - 从包含特定列的所有表中选择行

sql - Postgresql 从要比较的日期中提取 monthYear

sql - 如何从 Years 表创建 YearMonths 表?

sql - Oracle列值修改

sql - SQL Server 中区分大小写的变量名称?

sql-server - sql server mdf 文件数据库附件