update的機制問題

litterbaby發表於2007-04-01

update的機制問題

[@more@]

的機制問題

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 插進去,兩者的差異可能很大,可能完全不是一個數量級的時間和資源的消耗

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/222350/viewspace-907913/,如需轉載,請註明出處,否則將追究法律責任。

相關文章