为什么数据库执行删除和插入更新行?

时间:2014-07-10 11:32:49

标签: sql sql-server database oracle

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

2 个答案:

答案 0 :(得分:2)

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

有关一般用途和数据库的日志结构文件系统的讨论,请参阅http://blog.notdot.net/2009/12/Damn-Cool-Algorithms-Log-structured-storage

就使用此系统的系统而言,上述参考文献提到:

  

随着我大声赞美,你可能想知道是什么   系统已经使用这种算法。令人惊讶的是,很少   我知道,但这里有一些值得注意的:

     
      
  1. 虽然最初的Berkeley DB使用了相当标准的架构,但是Java端口,BDB-JE使用了我们刚才描述的所有组件。

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

  4.   
  5. PostgreSQL使用MVCC,其前瞻日志的结构允许我们描述的增量备份方法。

  6.   
  7. App Engine数据存储区基于Bigtable,它采用不同的磁盘存储方法,但事务层   使用乐观并发。

  8.   

http://blogs.justonedatabase.com/tag/update-in-place/还讨论了使用日志结构追加的优点,而不是更新到位。它提到:

  

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

答案 1 :(得分:2)

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

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

update table set clusterindexcol = clusterindexcol + 10

当记录移动到物理表中的其他位置时,它可能会再次更新。

或者您正在为多行更新主键列,检查重复项的最简单实现是删除/插入。