我需要根据是否对任何值进行任何更改来更新表中的几千行。目前我只是更新所有值,但不知道什么是更有效。我应该检查所有列以查看是否有任何更改和更新,或者我应该只是更新。 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......
什么是更快,什么是最佳实践
答案 0 :(得分:1)
请参阅Paul White博客上的两篇文章。
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