什么是缓存里的脏数据.
生活随笔
收集整理的這篇文章主要介紹了
什么是缓存里的脏数据.
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們知道Oracle 里用戶客戶端是通過(guò)session連接服務(wù)器里的Server process進(jìn)程來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的.
??????? 但是Server Process 并不會(huì)直接從數(shù)據(jù)文件中讀寫數(shù)據(jù), 而是把數(shù)據(jù)先放入SGA里面的Database buffer cache(數(shù)據(jù)庫(kù)高速緩存)里再進(jìn)行操作, 最終依靠后臺(tái)進(jìn)程DBWR 將緩存里修改后的數(shù)據(jù)寫回?cái)?shù)據(jù)文件.
如圖:
????????
上圖中, server process A想訪問(wèn)數(shù)據(jù)文件里的數(shù)據(jù)1, 首先會(huì)從緩存中找是不是已存在這些數(shù)據(jù),? 如果無(wú), 就會(huì)將數(shù)據(jù)文件中的數(shù)據(jù)1放到緩存中.? 然后就對(duì)緩存里的數(shù)據(jù)1進(jìn)行訪問(wèn).
當(dāng)Server process對(duì)緩存里的數(shù)據(jù)進(jìn)行讀或?qū)?? 那么我們就是那個(gè)數(shù)據(jù)是
1.已連接的(PINNED)數(shù)據(jù):? 正在被Server Process讀或?qū)懙臄?shù)據(jù).
2.Free空間(or unused):? 未放入數(shù)據(jù)的其他緩存空間. 如下圖:
?3.干凈(clean)數(shù)據(jù):? 緩存里還沒(méi)被server Process修改的數(shù)據(jù), 也就是緩存里和數(shù)據(jù)文件保持一致的數(shù)據(jù).就叫做干凈數(shù)據(jù).
??????????????????????????????????
?干凈數(shù)據(jù)是可以被其他session 訪問(wèn)的, 如下圖, 客戶端Client B也同樣想讀取數(shù)據(jù)1, 而緩存里的數(shù)據(jù)1是干凈的,所以Server Process B只需在緩存里讀取(邏輯讀)數(shù)據(jù)1就ok了, 避免了對(duì)數(shù)據(jù)文件的讀取(物理讀)
??
?4.臟數(shù)據(jù)(dirty)數(shù)據(jù): 假如上圖的緩存里數(shù)據(jù)1被Server process A修改了,?? 那么緩存里的數(shù)據(jù)1已經(jīng)與數(shù)據(jù)文件中的數(shù)據(jù)不一致了,那么數(shù)據(jù)1這時(shí)就成為了臟數(shù)據(jù),? 那么Server process B就不能讀出那個(gè)臟的數(shù)據(jù)1了, 跟數(shù)據(jù)庫(kù)里的不一致嘛, 否則就形成了臟讀.
?
這時(shí)我們就稱數(shù)據(jù)1為已連接的(正在被Server process修改)和臟的.
5.那么如何避免Server Process B的臟讀呢?
辦法很簡(jiǎn)單, Oracle只需要再將數(shù)據(jù)文件的數(shù)據(jù)1再一次放到緩存里的另1個(gè)地方中(free 空間). (又1物理讀)
然后Server process B對(duì)其進(jìn)行訪問(wèn).
如下圖:
?
?
這時(shí)緩存中又出現(xiàn)了1個(gè)數(shù)據(jù)1,只要Server process B 不對(duì)其修改,那么它就是干凈的,又可以供其他session 讀取.
6.假如這時(shí)DB buffer cache里面的free空間不足了,被各種數(shù)據(jù)占用, Server process如何讀取數(shù)據(jù)1呢.
???? 這時(shí)緩存中存在兩種數(shù)據(jù), 一種是臟數(shù)據(jù), 另1種是干凈數(shù)據(jù).? 這時(shí)有兩種選擇,一種是把緩存里的干凈數(shù)據(jù)清理掉釋放空間,另1種是清理臟數(shù)據(jù).
????? 如果清理臟數(shù)據(jù),那么對(duì)應(yīng)process serve對(duì)其的改動(dòng)就丟失了.? 所以oracle會(huì)清理緩存里的干凈數(shù)據(jù).
????? 而干凈數(shù)據(jù)也分已連接的和未連接的(對(duì)應(yīng)session已經(jīng)讀取完成). 所以正確來(lái)講Oracle會(huì)釋放緩存里未被連接的干凈數(shù)據(jù).
如下圖:
???
如上圖,雖然數(shù)據(jù)2也是干凈的,但是正在被Server Process C讀取, 而數(shù)據(jù)3是clean的而且是unpinned的, 所以就會(huì)把數(shù)據(jù)3釋放, 放入干凈的數(shù)據(jù)1,讓Server process B讀取.
7.假如這時(shí)DB buffer cache里面的free空間不足了,而且不存在為連接的干凈數(shù)據(jù),如何避免臟讀?
如上圖,這時(shí)就有兩種選擇,
1.就是等Server Process C讀取完數(shù)據(jù)2, 這是數(shù)據(jù)就是unpinned的, 然后釋放緩存里數(shù)據(jù)2的空間.
然后將數(shù)據(jù)文件的要讀的數(shù)據(jù)放到緩存(物理讀)
2.等Server Process A修改完臟的數(shù)據(jù)1后, 然后讓DBWR后臺(tái)進(jìn)程將緩存里修改后的數(shù)據(jù)1寫回?cái)?shù)據(jù)文件(物理寫), 這樣緩存里的數(shù)據(jù)1又和數(shù)據(jù)文件中的一致了(干凈了). 就直接可以讓其他session讀取了.
而 DBWR物理寫比較耗時(shí)間.
所以大量用戶進(jìn)行寫動(dòng)作時(shí), SGA里面的臟數(shù)據(jù)必然會(huì)很多, DBWR進(jìn)程也相當(dāng)繁忙, 通常這時(shí)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的訪問(wèn)就會(huì)變慢了.
嗯,增大SGA(內(nèi)存)是個(gè)好主意.!
??????? 但是Server Process 并不會(huì)直接從數(shù)據(jù)文件中讀寫數(shù)據(jù), 而是把數(shù)據(jù)先放入SGA里面的Database buffer cache(數(shù)據(jù)庫(kù)高速緩存)里再進(jìn)行操作, 最終依靠后臺(tái)進(jìn)程DBWR 將緩存里修改后的數(shù)據(jù)寫回?cái)?shù)據(jù)文件.
如圖:
????????
上圖中, server process A想訪問(wèn)數(shù)據(jù)文件里的數(shù)據(jù)1, 首先會(huì)從緩存中找是不是已存在這些數(shù)據(jù),? 如果無(wú), 就會(huì)將數(shù)據(jù)文件中的數(shù)據(jù)1放到緩存中.? 然后就對(duì)緩存里的數(shù)據(jù)1進(jìn)行訪問(wèn).
當(dāng)Server process對(duì)緩存里的數(shù)據(jù)進(jìn)行讀或?qū)?? 那么我們就是那個(gè)數(shù)據(jù)是
1.已連接的(PINNED)數(shù)據(jù):? 正在被Server Process讀或?qū)懙臄?shù)據(jù).
2.Free空間(or unused):? 未放入數(shù)據(jù)的其他緩存空間. 如下圖:
?3.干凈(clean)數(shù)據(jù):? 緩存里還沒(méi)被server Process修改的數(shù)據(jù), 也就是緩存里和數(shù)據(jù)文件保持一致的數(shù)據(jù).就叫做干凈數(shù)據(jù).
??????????????????????????????????
?干凈數(shù)據(jù)是可以被其他session 訪問(wèn)的, 如下圖, 客戶端Client B也同樣想讀取數(shù)據(jù)1, 而緩存里的數(shù)據(jù)1是干凈的,所以Server Process B只需在緩存里讀取(邏輯讀)數(shù)據(jù)1就ok了, 避免了對(duì)數(shù)據(jù)文件的讀取(物理讀)
??
?4.臟數(shù)據(jù)(dirty)數(shù)據(jù): 假如上圖的緩存里數(shù)據(jù)1被Server process A修改了,?? 那么緩存里的數(shù)據(jù)1已經(jīng)與數(shù)據(jù)文件中的數(shù)據(jù)不一致了,那么數(shù)據(jù)1這時(shí)就成為了臟數(shù)據(jù),? 那么Server process B就不能讀出那個(gè)臟的數(shù)據(jù)1了, 跟數(shù)據(jù)庫(kù)里的不一致嘛, 否則就形成了臟讀.
?
這時(shí)我們就稱數(shù)據(jù)1為已連接的(正在被Server process修改)和臟的.
5.那么如何避免Server Process B的臟讀呢?
辦法很簡(jiǎn)單, Oracle只需要再將數(shù)據(jù)文件的數(shù)據(jù)1再一次放到緩存里的另1個(gè)地方中(free 空間). (又1物理讀)
然后Server process B對(duì)其進(jìn)行訪問(wèn).
如下圖:
?
?
這時(shí)緩存中又出現(xiàn)了1個(gè)數(shù)據(jù)1,只要Server process B 不對(duì)其修改,那么它就是干凈的,又可以供其他session 讀取.
6.假如這時(shí)DB buffer cache里面的free空間不足了,被各種數(shù)據(jù)占用, Server process如何讀取數(shù)據(jù)1呢.
???? 這時(shí)緩存中存在兩種數(shù)據(jù), 一種是臟數(shù)據(jù), 另1種是干凈數(shù)據(jù).? 這時(shí)有兩種選擇,一種是把緩存里的干凈數(shù)據(jù)清理掉釋放空間,另1種是清理臟數(shù)據(jù).
????? 如果清理臟數(shù)據(jù),那么對(duì)應(yīng)process serve對(duì)其的改動(dòng)就丟失了.? 所以oracle會(huì)清理緩存里的干凈數(shù)據(jù).
????? 而干凈數(shù)據(jù)也分已連接的和未連接的(對(duì)應(yīng)session已經(jīng)讀取完成). 所以正確來(lái)講Oracle會(huì)釋放緩存里未被連接的干凈數(shù)據(jù).
如下圖:
???
如上圖,雖然數(shù)據(jù)2也是干凈的,但是正在被Server Process C讀取, 而數(shù)據(jù)3是clean的而且是unpinned的, 所以就會(huì)把數(shù)據(jù)3釋放, 放入干凈的數(shù)據(jù)1,讓Server process B讀取.
7.假如這時(shí)DB buffer cache里面的free空間不足了,而且不存在為連接的干凈數(shù)據(jù),如何避免臟讀?
如上圖,這時(shí)就有兩種選擇,
1.就是等Server Process C讀取完數(shù)據(jù)2, 這是數(shù)據(jù)就是unpinned的, 然后釋放緩存里數(shù)據(jù)2的空間.
然后將數(shù)據(jù)文件的要讀的數(shù)據(jù)放到緩存(物理讀)
2.等Server Process A修改完臟的數(shù)據(jù)1后, 然后讓DBWR后臺(tái)進(jìn)程將緩存里修改后的數(shù)據(jù)1寫回?cái)?shù)據(jù)文件(物理寫), 這樣緩存里的數(shù)據(jù)1又和數(shù)據(jù)文件中的一致了(干凈了). 就直接可以讓其他session讀取了.
而 DBWR物理寫比較耗時(shí)間.
所以大量用戶進(jìn)行寫動(dòng)作時(shí), SGA里面的臟數(shù)據(jù)必然會(huì)很多, DBWR進(jìn)程也相當(dāng)繁忙, 通常這時(shí)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的訪問(wèn)就會(huì)變慢了.
嗯,增大SGA(內(nèi)存)是個(gè)好主意.!
總結(jié)
以上是生活随笔為你收集整理的什么是缓存里的脏数据.的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle 权限介绍及管理
- 下一篇: Oracle sql解析类型, 软解析和