2011-04-01 52 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。这应该将处理保持在最低限度。