2011-04-01 53 views
0

我有一個語句來更新一個字段,如果相關的表記錄存在。查詢更新每個記錄。我不確定最有效/最好的做法是什麼。到目前爲止,我拿出2個解決方案案例VS多個更新

解決方法一: Case語句

UPDATE item 
SET IsRestricted = 
    CASE 
     WHEN restriction.Id is null THEN 0 
     ELSE 1 
    END 
FROM [dbo].[Item] item 
    left join [dbo].[Restriction] restriction 
     on restriction.Id = item.Id 

解決方法二:多個更新語句

UPDATE item 
SET IsRestricted = 1 
FROM [dbo].[Restriction] restriction 
    inner join [dbo].[Item] item 
     on restriction.Id = item.Id 

UPDATE item 
SET IsRestricted = 0 
FROM [dbo].[Item] item 
    left join [dbo].[Restriction] restriction 
     on item.Id = restriction.Id 
WHERE restriction.Id is null 

如果有人可以幫助我判斷哪些我應該使用它,將不勝感激。

注意:我不確定這是否是一個重複的帖子,到目前爲止只有我見過的類似的包含觸發器或各種其他的東西,我不知道如果這改變了答案。也可隨意建議替代方法

+0

你需要的IsRestricted列?在特定時間不會詢問是否存在限制,以確保您始終得到正確答案? – 2011-04-01 09:34:47

+2

把它們都放在同一個查詢窗口中,打開「包含實際執行計劃」(ctrl + m),運行批處理,觀察結果:) – Blorgbeard 2011-04-01 09:35:13

+0

@Damien這個標誌在那裏,因爲數據庫的使用情況會相當的性能密集而且我們不希望在特定時間進行查詢。儘管我並沒有真正尋找特定於我的問題的答案,也沒有像這兩種方法的一般比較那樣多的問題 – Manatherin 2011-04-01 09:49:47

回答

0

好後,一些性能測試,似乎它們都是相同的性能明智

1

正如有些人提到的,你可以做一些性能測試,並檢查執行計劃,以找出哪一個可能表現最好。

如果您只打算運行這個語句,我會使用第一種方法,因爲您知道需要更新所有記錄,並且一條語句使事情更加簡單。如果這要運行多次(即添加新數據時),那麼我會使用第二個解決方案,在where子句中加入另一個解決方案,在再次設置它時檢查它不是0/1。這應該將處理保持在最低限度。