Я унаследовал следующую ситуацию на веб-сайте ASP.Net + в базе данных SQL-сервера:
Существует большая таблица (много строк, много столбцов) с уникальным индексом в поле PartnerRef, varchar (50). Он также имеет первичный ключ, int, давайте назовем его UniqueId. За 8-10 лет было написано много кода, основанного на уникальности поля PartnerRef. Многие места / запросы используют критерии PartnerRef = @ partnerRef, чтобы найти одну конкретную запись. Внезапно мы получили сообщение о том, что партнеры начнут повторно использовать значения, иногда даже через одну неделю, поэтому может потребоваться создать новую запись, в то время как другая уже существует с таким же PartnerRef. Удаление уникального индекса и изменение всего кода сейчас не вариант из-за нехватки времени. Быстрое решение, которое я реализовал, заключалось в выполнении обновления перед каждой вставкой:
Update Table1
set PartnerRef = PartnerRef + '_' + Cast(UniqueId as varchar(10))
where PartnerRef=@partnerRef;
Insert new record using @partnerRef;
Итак, значение поля в предыдущей / существующей записи изменяется, а затем создается новая запись. Старая запись не может быть удалена так скоро, но исходное значение в старой записи уже не так важно после повторного использования, поэтому я могу изменить ее без проблем. Запрос на обновление выполняется перед каждой новой вставкой, но в большинстве случаев (возможно, на 90%) он ничего не меняет, предыдущей записи с тем же PartnerRef не существует. Оставляя в стороне глупость ситуации со всей структурой таблицы, мой актуальный вопрос касается производительности и оптимизации процесса обновления. Будет ли какое-либо преимущество от использования IF EXISTS UPDATE вместо простого обновления?
IF EXISTS (SELECT 1 FROM Table1 WHERE PartnerRef=@partnerRef)
Update Table1
set PartnerRef = PartnerRef + '_' + Cast(UniqueId as varchar(10)) where PartnerRef=@partnerRef;
Есть ли лучший / более быстрый способ сделать это обновление, пока мы не изменим веб-приложение и не удалим уникальный индекс, чтобы разрешить дублирование в PartnerRef? Спасибо за любую идею.