SQL Server - 更新语句中的连接或子查询?

时间:2010-02-08 19:34:20

标签: sql sql-server sql-server-2005 updates

是否有理由在性能方面使用其中一个UPDATE语句?

 UPDATE myTable
 SET    fieldx = 1
 FROM   myTable AS mt
      , myView AS mv
 WHERE  mt.id = mv.id


 UPDATE myTable
 SET    fieldx = 1
 WHERE  id IN ( SELECT id
                     FROM   myView )

2 个答案:

答案 0 :(得分:5)

他们可能会提出相同的执行计划,这意味着没有区别。要确认,只需在SSMS中尝试每个,并打开“包含执行计划”选项。

事实上,我想要的是:

UPDATE mt
SET mt.fieldx = 1
FROM myTable mt
    JOIN myView mv ON mt.ID = mv.ID

我更喜欢这种语法。虽然,它也会出现相同的执行计划。

为了证明这一点,我使用UPDATE语句的每个变体运行了一个测试。正如下面的执行计划所示,它们都是相同的 - 都表现相同:
alt text http://img707.imageshack.us/img707/7801/60422461.png


alt text http://img683.imageshack.us/img683/7874/41210682.png


alt text http://img708.imageshack.us/img708/5020/20506532.png

答案 1 :(得分:0)

虽然这不符合性能,但我更喜欢第一个例子,这样我就可以在不改变代码的底层结构的情况下更轻松地审查它。请注意我在评论中的位置和内容:

UPDATE myTable 
SET    fieldx = 1
--SELECT *
FROM   myTable AS mt 
      , myView AS mv 
WHERE  mt.id = mv.id