Каждая запись в базу данных имеет множество потенциальных побочных эффектов.
Удалить: строка должна быть удалена, индексы обновлены, внешние ключи проверены и, возможно, удалены каскадом и т. Д. Вставка: строка должна быть выделена - это может быть вместо удаленной строки, может не быть; должны быть обновлены индексы, проверены внешние ключи и т. д. Обновление: необходимо обновить одно или несколько значений; возможно, данные строки больше не помещаются в этот блок базы данных, поэтому необходимо выделить больше места, что может каскадировать в несколько перезаписываемых блоков или привести к фрагментированным блокам; если значение имеет ограничения внешнего ключа, они должны быть проверены и т. д.
Для очень небольшого количества столбцов или при обновлении всей строки удаление + вставка может быть быстрее, но проблема ограничения FK является большой. Конечно, возможно, у вас сейчас нет ограничений FK, но всегда ли это будет правдой? А если у вас есть триггер, проще написать код, обрабатывающий обновления, если операция обновления действительно является обновлением.
Еще одна проблема, о которой следует подумать, заключается в том, что иногда вставка и удаление содержат разные блокировки, чем обновление. База данных может заблокировать всю таблицу, пока вы вставляете или удаляете, в отличие от простой блокировки одной записи, пока вы обновляете эту запись.
В конце концов, я бы посоветовал просто обновить запись, если вы хотите ее обновить. Затем проверьте статистику производительности вашей БД и статистику для этой таблицы, чтобы увидеть, нужно ли улучшить производительность. Все остальное преждевременно.
Пример из системы электронной коммерции, над которой я работаю: мы сохраняли данные транзакции по кредитной карте в базе данных, используя двухэтапный подход: сначала напишите частичную транзакцию, чтобы указать, что мы начали процесс. Затем, когда данные авторизации будут возвращены из банка, обновите запись. Мы МОЖЕМ удалить, а затем снова вставить запись, но вместо этого мы просто использовали обновление. Наш администратор базы данных сообщил нам, что таблица была фрагментирована, потому что база данных выделяла только небольшой объем пространства для каждой строки, а обновление вызвало цепочку блоков, поскольку добавляло много данных. Однако вместо того, чтобы переключаться на DELETE + INSERT, мы просто настроили базу данных, чтобы всегда выделять всю строку, это означает, что обновление может без проблем использовать предварительно выделенное пустое пространство. Никакого изменения кода не требуется, и код остается простым и понятным.
person
Mr. Shiny and New 安宇
schedule
13.08.2009