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

时间:2010-06-15 19:19:20

标签: sql-server performance sql-server-2008 stored-procedures

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

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

基本上是这样的:

仅在提供相应参数时更新列,其余部分保持不变。

这很好用,但是如果接收到的参数为null,ISNULL调用将返回列的值,SQL Server会以某种方式对其进行优化吗?这可能是应用程序的性能瓶颈,其中表可能会大量更新(插入将不常见,因此性能没有问题)。所以我想弄清楚最好的方法是什么。有没有办法用CASE WHEN之类的东西来调整列表达式?该表将以wazoo为索引以及读取性能。这是最好的方法吗?此时我的另一种选择是在代码中创建UPDATE表达式(例如内联SQL)并对服务器执行它。这将解决我对性能的疑虑,但如果可能的话,我宁愿把它留在存储过程中。

2 个答案:

答案 0 :(得分:1)

ISNULL是最快的方式 - 唯一的方法就是传入NULL或实际值,并在应用程序中执行ISNULL。

答案 1 :(得分:1)

http://sqlblog.com/blogs/hugo_kornelis/archive/2007/09/30/what-if-null-if-null-is-null-null-null-is-null.aspx查看Hugo Kornelis的博客文章。关于COALESCE vs. ISNULL的讨论,请稍微谈谈。如果可移植性是未来的考虑因素,请查看COALESCE。

但是,从效果的角度来看,请查看Adam在http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx上以效果为中心的博客文章。 ISNULL更快。

您的选择......

顺便说一句,我有一堆SP就像你的例子,使用ISNULL没有性能问题。 (有点懒,我喜欢输入6对8个字符,并且是一个易患手指阅读障碍的小便,ISNULL更容易输入:-))