1、概述
當查詢某些數據的時候,發現數據塊的版本比我們要查詢的新,例如session1執行了dml操作並沒有提交,session2此時查找跟session1相關的dml操作的數據信息,此時查詢的數據卻是原來的數據信息。
查詢的過程會在undo段中查找該數據塊的前映像後,然後把前映像和current塊合併形成了一個CR block,通過查詢cr block就可以滿足數據的一致性了。
CR block存在與sga的buffer cache中,在db cache里申請一個數據塊,然後對應的回滾段的前映像生成cr block。
cr塊的數量是由隱含參數_db_block_max_cr_dba控制的,默認是最高同時存在5個cr塊,構造cr塊時cr block created計數器都會增加1.
由於cr block和current block的數據塊的rdba都是相同的,會放在相同的hash鏈上,當然某些block的cr block的版本過多,自然會引起hash鏈上的競爭,導致latch buffer cache chain閂競爭。
當然在利用回滾段的前映像和current block構造cr塊時,很有可能回滾段的已經被覆蓋,也就會出現常見的ora-01555快照過舊。
一個sql語句如何去查詢數據信息了,根據以前的latch基本記載知道獲取該數據塊的latch然後才能對該數據塊進行讀取,其實一個sql訪問數據信息的數據塊,需要像連結一樣的結構中去收索這個數據塊是否在記憶體中,此時訪問鍊表也需要一個latch,如果獲取失敗也就是會產生latch buffer cache chain等待了。