【发布时间】: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