在必须更新行时,数据库会进行删除还是插入?


13

因此,今天一位教授告诉我们,当数据库必须在内部(低级)进行更新时,它将进行删除,然后使用已更新的字段进行插入。然后他说这是在所有数据库中完成的,然后我开始讨论,告诉我认为这没有意义,但我没有足够的资源来支持我的职位。他似乎知道很多,但我不明白为什么数据库管理员会这样做。

我的意思是,我知道,如果您更新一个字段并且该行需要更多空间,那么它可能会物理删除该行并将其放在新数据的末尾。但是,例如,如果您减少了使用的空间,为什么要删除它并在最后插入它呢?

这是真的吗?有什么好处?


1
他是在谈论一种特定类型的数据库吗?
汤姆五世-尝试topanswers.xyz

1
@TomV他说的是SQL服务器,但他表示那是像这样在所有DBS做..
巴勃罗·马蒂亚斯·戈麦斯

Answers:


16

这是真的吗?

不,这是一个实现细节。如果数据库选择这样做则数据库可以实现适当的更新。

有什么好处?

将更新拆分为删除,然后再插入,通常会使实现更简单。潜在的附带好处包括,通过对拆分的删除/插入操作进行适当的排序,可以避免唯一索引中的瞬时键冲突

拆分更新可能比真正的就地更新要慢一些,并且生成更多的日志(无论如何总是不可能的)。

正如Kin在评论中指出的那样,如果您需要一个示例(对于SQL Server),请参见:

它也与实现MVCC有关。在有关MVCC的 Wikipedia页面中,提到了:

当MVCC数据库需要更新数据项时,它不会用新数据覆盖旧数据,而是将旧数据标记为已过时并在其他位置添加新版本。因此,存储了多个版本,但只有一个是最新版本。这样,读者就可以访问开始阅读时所拥有的数据,即使该数据是在其他人途中被修改或删除的。

另请参见Bruce Momjian撰写的PostgreSQL Internals pdf的第60页(Postgres使用MVCC): UPDATE实际上是a DELETE和an INSERT。”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.