Итак, сегодня профессор сказал нам, что, когда база данных должна сделать обновление, внутренне (на низком уровне) она делает удаление, а затем вставку с обновленными полями. Затем он сказал, что это сделано во всех базах данных, а затем я начал дискуссию, сказав, что, по-моему, в этом нет смысла, но у меня не было достаточно ресурсов для поддержки моей позиции. Кажется, он знает много, но я не могу понять, зачем это делать.
Я имею в виду, что я знаю, что если вы обновите поле и вам понадобится больше места для этой строки, то он может физически удалить строку и поставить ее в конце с новыми данными. Но если, например, вы уменьшаете используемое пространство, зачем его удалять и вставлять в конце?
Это правда? Каковы преимущества?
update
storage-engine
database-engine
Пабло Матиас Гомес
источник
источник
Ответы:
Нет, это деталь реализации. База данных может реализовать подходящее обновление на месте, если оно того пожелает.
Разделение обновления на удаление с последующей вставкой обычно упрощает реализацию. К потенциальным дополнительным преимуществам относится возможность избежать временных нарушений ключа в уникальном индексе путем соответствующей сортировки операций удаления / вставки.
Разделенное обновление может быть немного медленнее и генерировать больше журнала, чем истинное обновление на месте (что не всегда возможно в любом случае).
Как отметил Кин в комментарии, если вам нужен пример (для SQL Server), смотрите:
Это также связано с внедрением MVCC. На странице Википедии о MVCC упоминается:
См. Также стр. 60 PostgreSQL Internals pdf от Брюса Момджяна (Postgres использует MVCC): «
UPDATE
эффективно являетсяDELETE
иINSERT
».источник