`

update机制

阅读更多

就 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 插进去,两者的差异可能很大,可能完全不是一个数量级的时间和资源的消耗

 

1: 是的,data  buffer 中有回滚段块

2:update 如果仅仅是一个字段作为标记,并且长度不变,是可以的,row  lock 不消耗额外的资源,是数据行的一个属性。如果2个用户更新同一条记录,后来者需要等待


 

1:update的变化前数据写入日志文件,是为了  恢复的时候 写入回滚段的
2:data  buffer 中的变化是由 server  process完成(所谓的SGA中的block的变化都是server  process完成),而 block 写入文件是由dbwr 完成
insert 在回滚段中只 记录 rowid ,而 update 必须记录变化前数据

update 消耗更多的  回滚段、日志文件,当然查找数据、lock 等等都是问题,多用户情况下容易造成 并发  的等待

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics