【问题标题】:Performance of stored proc when updating columns selectively based on parameters?根据参数有选择地更新列时存储过程的性能?
【发布时间】:2010-06-15 19:19:20
【问题描述】:

我试图弄清楚这是否是性能相对较好的 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

所以基本上:

仅在提供相应参数的情况下更新列,其余部分不理会。​​strong>

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

【问题讨论】:

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


    【解决方案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 与 ISNULL 的讨论。如果可移植性是未来的考虑因素,请查看 COALESCE。

    不过,从 性能 的角度来看,请查看 Adam 以性能为中心的博客文章 http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx。 ISNULL 速度更快。

    你的选择...

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

    【讨论】:

    • 谢谢,我去看看。
    【解决方案2】:

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

    【讨论】:

    • 我知道这是存储过程上下文中最快的方法,但是与在代码中生成 UPDATE 语句相比会慢吗?换句话说,所有这些 ISNULL 语句是否都是性能问题,以至于我最好只执行内联 SQL?
    • 这种技术应该没有性能问题,但要小心并确保每次更新每一列(即使您将其设置为等于自身)不会有任何意外的副作用在触发器、更改数据捕获等中。
    猜你喜欢
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多