更新更改行

时间:2011-09-08 10:34:01

标签: sql tsql

我需要根据是否对任何值进行任何更改来更新表中的几千行。目前我只是更新所有值,但不知道什么是更有效。我应该检查所有列以查看是否有任何更改和更新,或者我应该只是更新。 e.g

 update someTable Set
   column1 = somevalue,
   column2 = somevalue,
   column3 = somevalue,
   etc....
 from someTable inner join sometable2 on
   someTable.id = sometable2.id
 where 
   someTable.column1 != sometable2.column1 or
   someTable.column2 != sometable2.column2 or
   someTable.column2 != sometable2.column2 or
   etc etc......

什么是更快,什么是最佳实践

3 个答案:

答案 0 :(得分:1)

请参阅Paul White博客上的两篇文章。

  1. The Impact of Non-Updating Updates讨论主要问题。
  2. Undocumented Query Plans: Equality Comparisons用于执行不等式比较的不太繁琐的方法,特别是如果您的列可以为空(WHERE NOT EXISTS (SELECT someTable.* INTERSECT SELECT someTable2.*))。

答案 1 :(得分:0)

我发现明确包含where子句时,排除no-op更新以便在处理大型表时执行得更快,但这是一个非常YMMV类型的问题。

如果可能,将两种方法并排比较,与一组实际数据进行比较。例如。如果您的表包含数百万行,并且更新仅影响10,请确保您的示例数据仅影响几行。或者同样,如果大多数行可能会发生变化,请使您的样本数据反映出来。

答案 2 :(得分:0)

我相信这是最好的方式。

表格和数据:

declare @someTable1 table(id int, column1 int, column2 varchar(2))
declare @someTable2 table(id int, column1 int, column2 varchar(2))

insert @someTable1 
          select 1,10 a, 'a3'
union all select 2,20  , 'a3' 
union all select 3,null, 'a4'

insert @someTable2
          select 1,10,   'a3' 
union all select 2,19,   'a3' 
union all select 3,null, 'a5'

更新

UPDATE t1
set t1.column1 = t2.column1,
t1.column2 = t2.column2
from @someTable1 t1
JOIN 
(select * from @someTable2
EXCEPT
select * from @someTable1) t2
on t2.id = t1.id

结果:

select * from @someTable1

id          a        b
----------- -------- --
1           10       a3
2           19       a3
3           NULL     a5