Скажем, у меня есть оператор слияния, который выглядит следующим образом:
merge TableA as target
using (select Id, Description, UnitCost
from TableB)
as source (Id, Description, UnitCost)
on (target.Id = source.Id)
when MATCHED then
update set Id = source.Id,
Description = source.Description,
UnitCost = Source.UnitCost
when NOT MATCHED then
insert (Id, Description, UnitCost)
values (source.Id, source.Description, source.UnitCost);
Когда я запускаю это, он говорит мне, сколько строк было затронуто. Если я запускаю его и знаю, что источник и пункт назначения одинаковы, я все равно получаю сообщение о том, что было затронуто количество строк x. В моем случае это около 200 строк. SQL Server перезаписывает те же данные на диск?
200 строк - ничто и их легко переписать, не влияя на производительность SQL Server. Но если у меня есть оператор слияния с 500 000+ строками и множеством индексов, то повторное обновление всех данных в таблице будет дорогостоящим.
Нужно ли проверять, что данные изменились первыми (по крайней мере, в тех случаях, когда производительность могла быть проблемой)?
Если это так, как мне это сделать в операторе слияния (возможно, используя мой пример выше)?