簡體   English   中英

MS SQL Server-存儲過程效率

[英]MS SQL Server - Stored Procedure Efficiency

我目前只有一個存儲過程,可以運行與此類似的命令:

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

還是最終等同於此?

感謝您的見解。

我認為在一條語句中完成所有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')

在一個或三個過程中執行UPDATE語句之間的區別可能可以忽略不計。

但是,為了回應評論,一個語句可能比三個語句更有性能。

不過,更重要的是限制UPDATE以便僅覆蓋需要通過WHERE子句進行更新的值。 否則,很可能您將要寫入大量記錄,以將STATUS的值設置為與磁盤上相同的值。 那會降低性能。

與使用IN的子選擇相比,通過JOIN獲得的速度也可能更高。

首先,請根據您的情況調整類似的內容,然后看看一次呼叫而不是三個呼叫是否能提高速度。

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';

編輯 :點頭圭多的回答用於限制從拉記錄數ANOTHER_TABLEIN子句中出現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM