Делают ли базы данных удаление и вставку при обновлении строк?

13

Итак, сегодня профессор сказал нам, что, когда база данных должна сделать обновление, внутренне (на низком уровне) она делает удаление, а затем вставку с обновленными полями. Затем он сказал, что это сделано во всех базах данных, а затем я начал дискуссию, сказав, что, по-моему, в этом нет смысла, но у меня не было достаточно ресурсов для поддержки моей позиции. Кажется, он знает много, но я не могу понять, зачем это делать.

Я имею в виду, что я знаю, что если вы обновите поле и вам понадобится больше места для этой строки, то он может физически удалить строку и поставить ее в конце с новыми данными. Но если, например, вы уменьшаете используемое пространство, зачем его удалять и вставлять в конце?

Это правда? Каковы преимущества?

Пабло Матиас Гомес
источник
1
Он говорил о конкретном типе базы данных?
Том V - попробуйте topanswers.xyz
1
@TomV он говорил о сервере sql, но потом сказал, что это было сделано так во всех БД.
Пабло Матиас Гомес

Ответы:

16

Это правда?

Нет, это деталь реализации. База данных может реализовать подходящее обновление на месте, если оно того пожелает.

Каковы преимущества?

Разделение обновления на удаление с последующей вставкой обычно упрощает реализацию. К потенциальным дополнительным преимуществам относится возможность избежать временных нарушений ключа в уникальном индексе путем соответствующей сортировки операций удаления / вставки.

Разделенное обновление может быть немного медленнее и генерировать больше журнала, чем истинное обновление на месте (что не всегда возможно в любом случае).

Как отметил Кин в комментарии, если вам нужен пример (для SQL Server), смотрите:

Это также связано с внедрением MVCC. На странице Википедии о MVCC упоминается:

Когда базе данных MVCC необходимо обновить элемент данных, она не будет перезаписывать старые данные новыми данными , а вместо этого пометит старые данные как устаревшие и добавит более новую версию в другом месте. Таким образом, хранится несколько версий, но только одна является последней. Это позволяет читателям получить доступ к данным, которые были там, когда они начали читать, даже если они были частично изменены или удалены кем-то еще.

См. Также стр. 60 PostgreSQL Internals pdf от Брюса Момджяна (Postgres использует MVCC): « UPDATEэффективно является DELETEи INSERT».

Пол Уайт 9
источник