Oracle 什麼時候select會產生redo?

wei-xh發表於2012-07-14

什麼情況下select會產生redo ?

1`)快速塊清除或者叫commit cleanout。事務提交的時候,oracle針對記憶體裡的塊 1)把資料塊ITL  ENTRYflag的標記為U 2)設定commit scnScn/Fsc列。有了兩個標記就可以告訴全世界這個事務已經提交。但ITL ENTRY Lck標誌和每個資料行頭的lb(鎖定位資訊)並不會清除。Oracle commit cleanout並不會產生日誌,這個你可能會感到比較奇怪,修改了塊,但是卻沒產生日誌。其實這個產生日誌的過程在後面的完整的塊清除的時候才做。也就是我們下一次讀取到這個資料塊的時候。

2)延遲塊清除。事務提交的時候,事務修改的塊已經不在記憶體裡了,這個時候,Oracle不會再從磁碟把塊讀取到記憶體裡做塊清除,而是在下一次讀取資料塊的時候,做塊清除的動作。這個塊清除的動作會產生Redo

需要注意直接路徑讀取由於繞過了buffer_cache,讀取過程直接在程式的私有PGA裡來完成,這個過程也會在程式私有的記憶體裡構造CR塊,雖然這個過程裡也會有延遲塊清除發生,但是不會產生Redo,而且不會把“髒”資料寫會到磁碟。這意味著,如果這個表一直被直接路徑讀取,將會有許多的浪費的延遲塊清除發生。11G針對大表的全表掃描,11G前並行掃描都會產生直接路徑的讀取。但是直接路徑讀取即使遇到了需要做延遲塊清除的塊也不會產生Redo

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

相關文章