MS SQL Server-存储过程效率

时间:2019-03-06 14:58:00

标签: sql-server stored-procedures

我目前只有一个存储过程,可以运行与此类似的命令:

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

或者这最终会等同吗?

感谢您的见识。

2 个答案:

答案 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提取的记录数。