Подход if-существующие-then-update-else-insert может содержать больше кода, чем delete-insert , но (в зависимости от того, сколько и какие индексы определены на столах) это намного меньше работы для сервера.
- Операция DELETE или INSERT требует изменения каждого индекса, точка.
- Операция UPDATE требует изменения только тех индексов, чьи поля были обновлены в этом случае.
Таким образом, если вы не измените каждое индексированное поле записи с вашими обновлениями, более длинный подход будет более эффективным.
РЕДАКТИРОВАТЬ: Обновление вашего вопроса говорит, что в настоящее время у вас нет никаких индексов, кроме первичного ключа (который я предполагаю, является кластеризованным ключом). Итак, для сравнения:
Когда строка уже существует, это 1 поиск кластеризованного индекса (при условии, что вы находите записи по их PK) и:
- delete-insert : 4 операции записи (удаление строки, удаление строки индекса PK, вставка строки, вставка строки индекса PK)
- проверка-обновление / вставка : 1 операция записи (строка обновления)
Когда строка еще не существует, это 1 поиск кластеризованного индекса и:
- delete-insert : 2 операции записи (вставка строки, вставка индексной строки PK)
- проверка-обновление / вставка : 2 операции записи (вставка строки, вставка строки индекса PK)
Чем больше индексов существует, тем хуже будет удаление / вставка для уже существующих строк. Кроме того, это может привести к ненужной фрагментации некластеризованных индексов из-за операций записи, которых можно избежать.