如果我知道错误请纠正我。当我们命令更新行时,数据库执行删除和插入。谁能告诉我为什么或建议我阅读一篇文章?
答案 0 :(得分:2)
某些数据库将使用删除和插入来实现更新,并且将具有日志结构文件系统,因此对行的更新会将旧的已删除行保留在其原始位置,并将该行的新副本写入其他位置
有关一般用途和数据库的日志结构文件系统的讨论,请参阅http://blog.notdot.net/2009/12/Damn-Cool-Algorithms-Log-structured-storage。
就使用此系统的系统而言,上述参考文献提到:
随着我大声赞美,你可能想知道是什么 系统已经使用这种算法。令人惊讶的是,很少 我知道,但这里有一些值得注意的:
虽然最初的Berkeley DB使用了相当标准的架构,但是Java端口,BDB-JE使用了我们刚才描述的所有组件。
CouchDB使用刚刚描述的系统,除了不是将日志分成段并进行垃圾收集,而是在有足够的陈旧数据累积时重写整个数据库。
PostgreSQL使用MVCC,其前瞻日志的结构允许我们描述的增量备份方法。
- 醇>
App Engine数据存储区基于Bigtable,它采用不同的磁盘存储方法,但事务层 使用乐观并发。
http://blogs.justonedatabase.com/tag/update-in-place/还讨论了使用日志结构追加的优点,而不是更新到位。它提到:
当我们附加更新而不是覆盖数据时,我们能够保留 更新时的旧数据和一致版本的数据 进展,这提供了一个强大的恢复机制应该 更新失败。我们可以轻松地为更新添加水印,我们可以 只有当我们知道更新时才选择移动该水印 已完成并成功保存在存储中。而与 我们必须编写并保留旧的更新就地语义 在更新发生之前,单独的日志中的版本能够 保证从更新失败中恢复(假设完全恢复) 从数据库备份副本对大多数人来说有点过于简单 人)。
答案 1 :(得分:2)
大多数DBMS会尝试在没有删除/插入的情况下进行更新。
但是可能存在一些由于物理存储而需要这种情况的情况,例如:您更新执行全表扫描的聚簇索引,更新将更改表中该记录的位置,例如
update table set clusterindexcol = clusterindexcol + 10
当记录移动到物理表中的其他位置时,它可能会再次更新。
或者您正在为多行更新主键列,检查重复项的最简单实现是删除/插入。