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

Pab*_*mez 14 storage-engine database-engine update

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

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

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

Pau*_*ite 17

这是真的吗?

不,这是一个实现细节。如果数据库愿意,它可以就地实施合适的更新。

有什么好处?

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

与真正的就地更新相比,拆分更新可能会慢一点并生成更多日志(无论如何这并不总是可能的)。

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

它也与实现MVCC有关。在维基百科关于MVCC 的页面中,提到了:

当 MVCC 数据库需要更新一项数据时,它不会用新数据覆盖旧数据,而是将旧数据标记为过时并在别处添加新版本。因此存储了多个版本,但只有一个是最新的。这允许读者访问他们开始阅读时存在的数据,即使它被其他人修改或删除。

另请参阅Bruce Momjian的PostgreSQL Internals pdf的第 60 页(Postgres 使用 MVCC): UPDATE实际上是一个DELETE和一个INSERT。”