2014-07-10 31 views
2

如果我知道错误,请纠正我。当我们命令更新一行时,数据库会执行删除和删除操作。谁能告诉我为什么或建议我阅读一篇文章?为什么数据库在删除和插入时更新行?

+0

你介意解释一下好吗?用一些例子。 –

+0

也许你指的是如何更新B-Tree索引? DBMS不能只是改变键值,而不能将它移动到索引结构中的不同位置。 –

回答

2

一些数据库将使用删除和插入来实现更新,并且将有一个日志结构的文件系统,因此对行的更新会将旧的删除行留在其原始位置,并在某处写入该行的新副本其他。

查看http://blog.notdot.net/2009/12/Damn-Cool-Algorithms-Log-structured-storage讨论日志结构文件系统的一般用途和数据库。

在什么系统使用这个条款,上述参考文献提及:

跟我唱它的赞美诗那么大声,你可能想知道什么 系统已经使用这种算法。有令人惊讶的少数 我所知道的,但这里有一些显着的:

  1. 尽管最初的Berkeley DB的使用相当标准的架构,Java移植,BDB-JE使用所有的组件,我们刚刚描述。

  2. CouchDB使用刚才描述的系统,除了不是将日志分成段和垃圾收集它们,而是在有足够陈旧的数据积累时重写它的整个数据库。

  3. PostgreSQL使用MVCC,它的writeahead日志结构化,以允许我们描述的增量备份方法。

  4. App Engine数据存储基于Bigtable,它采用不同的磁盘存储方法,但事务层 使用乐观并发。有关使用日志结构附加,而不是替代更新的优点

http://blogs.justonedatabase.com/tag/update-in-place/也举行了会谈。它提到:

当我们追加更新,而不是覆盖数据,我们能够保持 旧的和一致的版本的数据,而更新是在 进步,这提供了一个强大的恢复机制应该 更新失败。我们可以轻松地为更新添加水印,只有当我们知道更新已完成并成功保存在存储中时,我们才可以选择仅移动该水印。鉴于 更新原地语义,我们必须在更新发生之前将旧版本 写入并保留在单独的日志中,以便能够保证从失败的更新中恢复(假设从数据库完全恢复 备份副本对于大多数 人来说有点过于简单)。

2

大多数DBMS将尝试在没有删除/插入的情况下进行更新。

但是由于物理存储的原因,可能会有一些情况需要这种情况。您更新聚簇索引执行全表扫描,更新将更改表中该记录的位置,例如,

update table set clusterindexcol = clusterindexcol + 10 

当记录移动到物理表内的不同位置时,它可能会第二次更新。

或者您正在更新多个行的主键列,检查重复项的最简单实现是delete/insert。

相关问题