[英]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_TABLE
與IN
子句中出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.