我正在试图弄清楚这是否是性能相对较好的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)并对服务器执行它。这将解决我对性能的疑虑,但如果可能的话,我宁愿把它留在存储过程中。
答案 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更容易输入:-))