我目前只有一个存储过程,可以运行与此类似的命令:
UPDATE TABLE
SET STATUS = '02'
WHERE ID IN (SELECT ID FROM ANOTHER TABLE WHERE STATUS IN ('01'))
UPDATE TABLE
SET STATUS = '05'
WHERE ID IN (SELECT ID FROM ANOTHER TABLE WHERE STATUS IN ('08'))
UPDATE TABLE
SET STATUS = '06'
WHERE ID IN (SELECT ID FROM ANOTHER TABLE WHERE STATUS IN ('04'))
这是一个伪造的过程,但模仿了我们实际应用程序的工作。如果我将每个UPDATE语句分解到其自己的存储过程中,然后在我的初始SP中执行每个过程,例如:
EXEC UpdateStatus02
EXEC UpdateStatus05
EXEC UpdateStatus06
或者这最终会等同吗?
感谢您的见识。
答案 0 :(得分:3)
我认为在一条语句中进行所有3次更新会更快。
您可以使用联接和case语句来做到这一点,请参见下面的示例
update t
set Status = case when t2.Status = '01' then '02'
when t2.Status = '08' then '05'
when t2.Status = '04' then '06'
end
from table t
inner join another table t2
on t2.id = t.id
where t2.Status in ('01', '08', '04')
答案 1 :(得分:1)
在一个或三个过程中执行UPDATE
语句之间的区别可能可以忽略。
但是,为了回应评论,一个语句可能比三个语句更有效。
但是,更重要的是限制UPDATE
,因此仅覆盖值需要通过WHERE
子句进行更新。否则,很可能您将要写入大量记录以将STATUS
的值设置为已经存在的相同值。那会降低性能。
与通过JOIN
进行的子选择相比,从IN
获得的速度也可能更高。
我首先会针对您的情况进行调整,然后看看您一次通话是否比三次通话的速度更快。
UPDATE tgt
SET tgt.STATUS = CASE WHEN src.STATUS IN ('01') THEN '02'
WHEN src.STATUS IN ('08') THEN '05'
WHEN src.STATUS IN ('04') THEN '06'
FROM
TABLE AS tgt
JOIN
ANOTHER_TABLE AS src
ON
src.ID = tgt.ID
AND
src.STATUS IN ('01','04','08')
WHERE
tgt.STATUS <> CASE WHEN src.STATUS IN ('01') THEN '02'
WHEN src.STATUS IN ('08') THEN '05'
WHEN src.STATUS IN ('04') THEN '06';
编辑:引用Guido的回答,以限制使用ANOTHER_TABLE
子句从IN
提取的记录数。