update的时候数据库的处理情况

原创 2004年07月03日 00:56:00

 

有人问到:

    今天听一个IBM的人说数据库在update时是先删除原记录,然后在插入,对此我有些疑问,oracle好像不是这样的,请大家能否阐述一下update的过程,更新主键和不更新主键的处理是否一样?不胜感激。另外,那个IBM的人还说update和insert不是一个数量级的动作,我认为要具体分析,对同数据量的操作,update需要定位,但是慢多少呢?

 

答:

其他数据库跟oracle可能不同 ,但是就 oracle 而言,update 的时候,如果存在索引字段的更新,则删除原索引条目(不是真正的删除数据,仅仅是在该行标记为 删除)插入新的索引条目,对于row本身的更新,是在行物理地更改,如果行的长度增加到当前位置无法容纳,则行的位置被提到 block的最上面一条记录的位置之上,假如该块已经无法容纳,则在原来行的物理位置保留一个指针,行被迁移到新的block,而保留的指针就是指向新的block的位置。这时索引中rowid不用发生变化,查询的时候先找到 那保留的指针,再去找 实际的新的位置。假如行迁移后再发生update 又导致迁移,则oracle首先看原来的位置的block是否具有容纳该行的空间,如果有就又迁移回去,如果没有就迁移到新的 块,修改原来最早块处的指针。 也就是说不会存在2个指针的查找才能找到 行.更新的时候,变化前后变化后的数据都被写入 redo ,变化前数据还被写入 回滚段,变化后数据被应用于 data buffer 。

若假设存在表t(a,b,c)
update t set a = ... where b = ... and c = ...
则回滚段中只记录 a 的变化前的值,关于update 的时候通常需要通过索引去定位,否则是全表扫描就很慢了
而insert 则只是找个 block 插进去,两者的差异可能很大,可能完全不是一个数量级的时间和资源的消耗

 

更多的详细的探讨请参考:http://www.itpub.net/showthread.php?threadid=129524

 


关于mysql锁表的几种形式

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数...
  • q959249819
  • q959249819
  • 2016年04月26日 09:51
  • 3803

什么时候用存储过程---存储过程好处

存储过程一般用于处理比较复杂的任务,基础ms这个平台,可以大大降低耗时,其编译机制也提高了数据库执行速度。 当然在系统控制方便方面,例如当系统进行调整时,这是只需要将后台存储过程进行更改,而不需要更...
  • guo00110211
  • guo00110211
  • 2014年06月11日 11:01
  • 5376

MYSQL Innodb 锁行还是锁表问题探讨

关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况。为什么呢?先看一下这篇文章。        做项目时由于业务...
  • zmx729618
  • zmx729618
  • 2016年06月21日 17:16
  • 3957

update的时候数据库的处理情况

update的时候数据库的处理情况 http://blog.csdn.net/biti_rainy/article/details/32806 有人问到: ...
  • zdy0_2004
  • zdy0_2004
  • 2015年03月14日 00:39
  • 322

关于如何避免操作(update、delete)mysql数据库时忘记添加where而导致全表修改或删除情况

在实际开发中,有时在对数据库进行更新或删除时,因忘记添加了where条件而造成了对整表的更新或删除。OMG,从网上找了许多的如何恢复误操作的方法,都是通过查看日志转换成sql语句再进行恢复。(好麻烦啊...
  • liboyang71
  • liboyang71
  • 2017年06月13日 17:32
  • 694

关于如何避免操作(update、delete)mysql数据库时忘记添加where而导致全表修改或删除情况

在实际开发中,有时在对数据库进行更新或删除时,因忘记添加了where条件而造成了对整表的更新或删除。OMG,从网上找了许多的如何恢复误操作的方法,都是通过查看日志转换成sql语句再进行恢复。(好麻烦啊...
  • weialemon
  • weialemon
  • 2017年11月15日 13:54
  • 66

使用windows update API 获取补丁更新情况列表

  • 2015年07月10日 15:50
  • 20.2MB
  • 下载

Maven管理项目的时候 Update Project后jre变成1.5

用maven建完web项目后,由于jre的版本和Tomcat的版本是有要求的,所以有很多朋友常常出现下列问题: 1、这里,我明明设置了我的JRE是1.8了2、然而,当我 Update Project后...
  • hbb171220965
  • hbb171220965
  • 2017年05月27日 10:04
  • 203

Maven管理项目的时候 Update Project后jre变成1.5

用maven建完web项目后,由于jre的版本和Tomcat的版本是有要求的,所以有很多朋友常常出现下列问题: 1、这里,我明明设置了我的JRE是1.8了 2、然而,当我 Update Proj...
  • Ashes18
  • Ashes18
  • 2017年04月23日 10:32
  • 1537

Windows 8.1 Update 优缺点比较(找到使用一段时候后卡顿的原因了)

----------------------------------------------------------------------------------------------------...
  • maxsky
  • maxsky
  • 2014年04月30日 00:27
  • 3927
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:update的时候数据库的处理情况
举报原因:
原因补充:

(最多只允许输入30个字)