所以今天一位教授告诉我们,当数据库必须进行更新时,在内部(在低级别)它会先删除,然后再插入更新的字段。然后他说这是所有数据库都做的事情,然后我开始讨论说我认为这没有意义,但我没有足够的资源来支持我的立场。他似乎知道很多,但我不明白为什么 dbs 会那样做。
我的意思是,我知道如果您更新一个字段并且您需要更多空间来存储该行,那么它可能会物理删除该行并将其放在新数据的末尾。但是,例如,如果您减少使用的空间,为什么要删除并在最后重新插入呢?
这是真的吗?有什么好处?
所以今天一位教授告诉我们,当数据库必须进行更新时,在内部(在低级别)它会先删除,然后再插入更新的字段。然后他说这是所有数据库都做的事情,然后我开始讨论说我认为这没有意义,但我没有足够的资源来支持我的立场。他似乎知道很多,但我不明白为什么 dbs 会那样做。
我的意思是,我知道如果您更新一个字段并且您需要更多空间来存储该行,那么它可能会物理删除该行并将其放在新数据的末尾。但是,例如,如果您减少使用的空间,为什么要删除并在最后重新插入呢?
这是真的吗?有什么好处?
不,这是一个实现细节。如果数据库愿意,它可以在适当的位置实施适当的更新。
将更新拆分为删除然后插入通常会使实现更简单。潜在的附带好处包括能够通过对拆分删除/插入操作进行适当排序来避免唯一索引中的瞬时键违规。
与真正的就地更新相比,拆分更新可能会慢一些并生成更多日志(无论如何这并不总是可能的)。
正如 Kin 在评论中指出的那样,如果您需要一个示例(对于 SQL Server),请参阅:
它也与实现 MVCC 有关。在关于MVCC的维基百科页面中,提到了:
另请参阅Bruce Momjian 的PostgreSQL Internals pdf第 60 页(Postgres 使用 MVCC): “
UPDATE
实际上是 aDELETE
和 anINSERT
。”