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

 

有人问到:

    今天听一个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

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值