代码之家  ›  专栏  ›  技术社区  ›  kprobst

根据参数有选择地更新列时存储过程的性能?

  •  0
  • kprobst  · 技术社区  · 15 年前

    我正试图弄清楚这是否是性能相对良好的T-SQL(这是SQL Server 2008)。我需要创建一个更新表的存储过程。proc接受的参数和表中的列一样多,除了pk列之外,它们都默认为空。程序主体如下:

    CREATE PROCEDURE proc_repo_update 
        @object_id bigint
        ,@object_name varchar(50) = NULL
        ,@object_type char(2) = NULL
        ,@object_weight int = NULL
        ,@owner_id int = NULL
        -- ...etc
    AS
    BEGIN
        update
            object_repo
        set
            object_name = ISNULL(@object_name, object_name)
            ,object_type = ISNULL(@object_type, object_type)
            ,object_weight = ISNULL(@object_weight, object_weight)
            ,owner_id = ISNULL(@owner_id, owner_id)
            -- ...etc
        where
            object_id = @object_id
    
        return @@ROWCOUNT
    
    END
    

    所以基本上:

    只有在提供了相应的参数的情况下才更新列,而不更新其他列。

    这已经足够好了,但是 ISNULL 如果接收到的参数为空,则调用将返回列的值,SQL Server是否会以某种方式对此进行优化?这可能是应用程序的性能瓶颈,在该应用程序中,表可能会被大量更新(插入将很少见,因此性能没有问题)。所以我想知道最好的方法是什么。有没有一种方法可以用 CASE WHEN 还是什么?该表也将为wazoo编制索引,以获得读取性能。这是最好的方法吗?我的另一个选择是 UPDATE 代码中的表达式(例如内联SQL)并针对服务器执行它。这可以解决我对性能的疑虑,但如果可能的话,我宁愿将其保留在存储过程中。

    2 回复  |  直到 15 年前
        1
  •  1
  •   SAinCA    15 年前

    看看Hugo Kornelis的博客帖子 http://sqlblog.com/blogs/hugo_kornelis/archive/2007/09/30/what-if-null-if-null-is-null-null-null-is-null.aspx . 下面我们来讨论一下联合对IsNull。如果可移植性是未来的考虑因素,请看coalesce。

    然而,从 性能 透视图,看一下Adam以性能为中心的博客帖子 http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx . IsNull速度更快。

    你的选择…

    顺便说一句,我有很多和您的例子一样的SP,使用isNull没有性能问题。(有点懒惰,我喜欢打6个字符对8个字符,而且有一点点容易出现手指失语症,这是一个很容易打的字。)

        2
  •  1
  •   Mike M.    15 年前

    isNull是最快的方法-唯一可以改进的方法是传入空值或实际值,然后在应用程序中执行isNull。