Oracle帶你理解什麼是緩存中的髒數據

總結:所謂的髒數據就是在緩存中被修改了的數據!

在Oracle 裏用戶客戶端是通過session連接服務器裏的Server process進程來訪問數據庫的.
        但是Server Process 並不會直接從數據文件中讀寫數據, 而是把數據先放入SGA裏面的Database buffer cache(數據庫高速緩存)裏再進行操作, 最終依靠後臺進程DBWR 將緩存裏修改後的數據寫回數據文件.

如圖:
         

什麼是緩存裏的髒數據. - 饑民 - 饑民2011

上圖中, server process A想訪問數據文件裏的數據1, 首先會從緩存中找是不是已存在這些數據,  如果無, 就會將數據文件中的數據1放到緩存中.  然後就對緩存裏的數據1進行訪問.

當Server process對緩存裏的數據進行讀或寫.  那麼我們就是那個數據是

1.已連接的(PINNED)
數據:  正在被Server Process讀或寫的數據.



2.Free空間(or unused):  未放入數據的其他緩存空間. 如下圖:

什麼是緩存裏的髒數據. - 饑民 - 饑民2011


 3.乾淨(clean)數據:  緩存裏還沒被server Process修改的數據, 也就是緩存裏和數據文件保持一致的數據.就叫做乾淨數據.
                                   

 乾淨數據是可以被其他session 訪問的, 如下圖, 客戶端Client B也同樣想讀取數據1, 而緩存裏的數據1是乾淨的,所以Server Process B只需在緩存裏讀取(邏輯讀)數據1就ok了, 避免了對數據文件的讀取(物理讀)

什麼是緩存裏的髒數據. - 饑民 - 饑民2011

 

 


 4.髒數據(dirty)數據: 假如上圖的緩存裏數據1被Server process A修改了,   那麼緩存裏的數據1已經與數據文件中的數據不一致了,那麼數據1這時就成爲了髒數據,  那麼Server process B就不能讀出那個髒的數據1了, 跟數據庫裏的不一致嘛, 否則就形成了髒讀.

什麼是緩存裏的髒數據. - 饑民 - 饑民2011

 

這時我們就稱數據1爲已連接的(正在被Server process修改)和髒的.


5.那麼如何避免Server Process B的髒讀呢?

辦法很簡單, Oracle只需要再將數據文件的數據1再一次放到緩存裏的另1個地方中(free 空間). (又1物理讀)
然後Server process B對其進行訪問.

如下圖:

什麼是緩存裏的髒數據. - 饑民 - 饑民2011

 

 
這時緩存中又出現了1個數據1,只要Server process B 不對其修改,那麼它就是乾淨的,又可以供其他session 讀取.

6.假如這時DB buffer cache裏面的free空間不足了,被各種數據佔用, Server process如何讀取數據1呢.

     這時緩存中存在兩種數據, 一種是髒數據, 另1種是乾淨數據.  這時有兩種選擇,一種是把緩存裏的乾淨數據清理掉釋放空間,另1種是清理髒數據.

      如果清理髒數據,那麼對應process serve對其的改動就丟失了.  所以oracle會清理緩存裏的乾淨數據.

      而乾淨數據也分已連接的和未連接的(對應session已經讀取完成). 所以正確來講Oracle會釋放緩存裏未被連接的乾淨數據.

如下圖:

什麼是緩存裏的髒數據. - 饑民 - 饑民2011

 

 

 
如上圖,雖然數據2也是乾淨的,但是正在被Server Process C讀取, 而數據3是clean的而且是unpinned的, 所以就會把數據3釋放, 放入乾淨的數據1,讓Server process B讀取.

7.假如這時DB buffer cache裏面的free空間不足了,而且不存在未連接的乾淨數據,如何避免髒讀?

如上圖,這時就有兩種選擇, 
1.就是等Server Process C讀取完數據2, 這是數據就是unpinned的, 然後釋放緩存裏數據2的空間. 
然後將數據文件的要讀的數據放到緩存(物理讀)

2.等Server Process A修改完髒的數據1後, 然後讓DBWR後臺進程將緩存裏修改後的數據1寫回數據文件(物理寫), 這樣緩存裏的數據1又和數據文件中的一致了(乾淨了). 就直接可以讓其他session讀取了.
而 DBWR物理寫比較耗時間.


所以大量用戶進行寫動作時, SGA裏面的髒數據必然會很多, DBWR進程也相當繁忙, 通常這時對數據庫數據的訪問就會變慢了.
嗯,增大SGA(內存)是個好主意.!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章