Как и многие разработчики, я выполняю множество операций слияния с данными, в частности с SQL Server.
Исторически я использовал старый прием: -
1) Выполнение левого соединенияна существующие данные и вставляя что-либо, для чего у меня нет соответствующей записи.
2) После 1), обновляя строки в моей целевой таблице.
Я должен понизить производительностьна 1).Это неизбежно.Однако, на 2), я был довольно расточительным.Вместо того, чтобы просто обновлять материал, который требует обновления, я обновил все, что соответствовал (независимо от того, изменились ли базовые данные или нет).
Оказывается, что SQL Server не слишком умен для такого рода обновлений,Он не выполняет предварительной проверки, чтобы определить, что то, что вы собираетесь обновить, отличается от того, что вы используете для его обновления.Следовательно, обновления, выполняемые в этом направлении, приводят к физической записи и влияют на все индексы, которые ссылаются на поле.
Итак, из моего POV я могу выбрать следующие варианты: -
1) Продолжитькак обычно, купаясь в текущей расточительности моей рутины (и ежедневно обновляя индексы на больших БД)
- Плюсы: это просто.
- Минусы: это дерьмо.
2) Напишите больше операторов UPDATE, которые обновляют определенное поле, если поле изменилось.
Например,
UPDATE
p2
SET
[SpecificField] = p1.[SpecificField]
FROM
@source p1,
Dest p2
WHERE
p2.ExternalKey = p1.ExternalKey
AND COALESCE(p1.[SpecificField],'') <> COALESCE(p2.[SpecificField],'')
- Плюсы: это очень специфично, обновляется только притребуется обновление.
- Минусы: множество различных операторов обновления для таблиц с большим количеством столбцов.
3) Что-то бесконечно лучше, чем предлагает сообщество переполнения стека.
Я бы очень хотел пойти с 3).Мои варианты действительно ограничены 1 или 2?Заметка.Я посмотрел в MERGE INTO.Те же проблемы, правда.