理解redo(11)truncate和select的redo

很多系統(tǒng),在作刪除操作時,都只是做一個標(biāo)志位,并不會去做磁盤置0那樣昂貴的操作。truncate也如是,更改的只是segment header和i-node表。truncate 會產(chǎn)生redo,是修改數(shù)據(jù)字典產(chǎn)生的,不是刪除數(shù)據(jù)來的。truncate降低HWM,釋放extent,重新生成data_object

很多系統(tǒng),在作刪除操作時,都只是做一個標(biāo)志位,并不會去做磁盤置0那樣昂貴的操作。truncate也如是,更改的只是segment header和i-node表。truncate 會產(chǎn)生redo,是修改數(shù)據(jù)字典產(chǎn)生的,不是刪除數(shù)據(jù)來的。truncate降低HWM,釋放extent,重新生成data_object_id。之所以比delete快,是因為它根本不需要刪除數(shù)據(jù),redo只是記錄這個操作本身而不會有大量數(shù)據(jù)的redo記錄。因此,對于truncate操作,如果我們知道以前的data_object_id,并且空間未被重用,我們?nèi)匀豢梢哉一財?shù)據(jù)。

什么情況下select會產(chǎn)生redo ?

1`)快速塊清除或者叫commit clean out。事務(wù)提交的時候,oracle針對內(nèi)存里的塊:

a)把數(shù)據(jù)塊ITL? ENTRY里flag的標(biāo)記為U

b)設(shè)置commit scn在Scn/Fsc列

有了這兩個標(biāo)記就可以告訴全世界這個事務(wù)已經(jīng)提交。但ITL ENTRY 的Lck標(biāo)志和每個數(shù)據(jù)行頭的lb(鎖定位信息)并不會清除。Oracle 做commit clean out并不會產(chǎn)生日志,這個你可能會感到比較奇怪,修改了塊,但是卻沒產(chǎn)生日志。其實這個產(chǎn)生日志的過程在后面的完整的塊清除的時候才做。也就是我們下一次select到這個數(shù)據(jù)塊的時候。

2)延遲塊清除。事務(wù)提交的時候,事務(wù)修改的塊已經(jīng)不在內(nèi)存里了,這個時候,Oracle不會再從磁盤把塊讀取到內(nèi)存里做塊清除,而是在下一次讀取數(shù)據(jù)塊的時候,做塊清除的動作。這個塊清除的動作會產(chǎn)生Redo。

另外,因為存在遞歸等操作,若是對某個事務(wù)產(chǎn)生的redo進行會話級的丈量,可能有失偏頗,合理的是,基于實例級的測量:

select name,value from v$sysstat where name=’redo size’;?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊8 分享