Oracle Buffer-cache (数据高速缓存)作用概述
生活随笔
收集整理的這篇文章主要介紹了
Oracle Buffer-cache (数据高速缓存)作用概述
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這篇文章是參考甲骨論老相老師所做的教學視頻所做的學習筆記.
http://v.youku.com/v_show/id_XMzkyMTk3ODM2.html
首先簡單說明一下Oracle數(shù)據(jù)庫的結構.
1. 數(shù)據(jù)庫的作用:
1.存儲數(shù)據(jù)
2.方便地檢索和處理數(shù)據(jù).
2.Oracle的簡單結構
1.存儲數(shù)據(jù)( Oracle 文件)
2.方便地檢索和處理數(shù)據(jù). (Oracle 實例)
可見對于Oracle數(shù)據(jù)庫來講, 數(shù)據(jù)都是存放在Oracle文件中的.
而前面章節(jié)也提到過,? Oracle文件分3大類,? 控制文件/ 數(shù)據(jù)文件/ 重做日志文件 --> 歸檔日志文件
實際上數(shù)據(jù)庫所有數(shù)據(jù)都存放在數(shù)據(jù)文件中的,?? 重做日志文件只不過是記錄了數(shù)據(jù)文件的數(shù)據(jù)變化,而不是數(shù)據(jù)文件的一份copy.
3. 數(shù)據(jù)文件的3層結構(block, extend, segment)
詳細可以參考我翻譯的官方文檔啦:
http://nvd11.blog.163.com/blog/static/200018312201282354948602/
下面是簡單介紹:
???? Oracle 的數(shù)據(jù)文件在物理上可以分3層結構,就是塊(block)/區(qū)(extend)/段(segment) 啦.
?其中最基本的單位是block
?而extend是由一段物理上連續(xù)的block組成的單位.
?segment是由若干個extend(無需物理連續(xù))的extend組成的.
大概結構如下圖:
?
如上圖,可以看出一個表空間內(nèi)有兩個數(shù)據(jù)文件, 里面3個extends組成1個數(shù)據(jù)段
仔細觀察可以分析出:
* 1個表空間可以有多個數(shù)據(jù)文件. 但1個數(shù)據(jù)文件只能存在于1個表空間內(nèi)(不能跨表空間)
* 在1個表空間內(nèi)每個block的大小是相同的
* 每個extend 都是由連續(xù)的blocks組成, 所以1個extend只能在1個數(shù)據(jù)文件中(不同數(shù)據(jù)文件中的block肯定不連續(xù)的啦).
* 1個segment 由若干個extends組成, 這些extends不必物理連續(xù), 所以segment可以跨數(shù)據(jù)文件保存.
* 1個segment只能存放在1個表空間內(nèi) , 不能跨表空間
一般來講, 一個segment就用來存放1張表或索引的數(shù)據(jù),? 如果這個segment是存放表的就叫數(shù)據(jù)段, 如果是存放索引的就叫索引段.
Oracle 1個segment只能存放在1個表空間內(nèi) ,是不是代表1張表不能跨表空間存放數(shù)據(jù)呢.
大部分表都是存放在1個表空間內(nèi)的,但是有例外, 這就是分區(qū)表.
有些表由于數(shù)據(jù)量實在過大,?? 可以根據(jù)一些規(guī)則(如地區(qū)), 分開存放在若干個表空間, 每個表空間中有1個(只能有1個)segment內(nèi)存放這個分區(qū)表的數(shù)據(jù). 這樣的話 檢索1個地區(qū)的數(shù)據(jù)就只訪問1個表空間內(nèi)的數(shù)據(jù)文件就ok了.
也就是說 分區(qū)表可以又多個segments組成,? 但是每1個segment都存放在不同的表空間中.
如下圖啦:
4,段區(qū)塊的分配
???? 當user建立一張表, Oracle就會為這種表分配1個數(shù)據(jù)段, 同時分配1個extend,???? 這張表的數(shù)據(jù)就存放在這個extend的blocks中,? 當其blocks用完時,? Oracle會重新1個extend到這個數(shù)據(jù)段,? 而不會單獨第分配個1個block.
5.Block是Oracle最少的磁盤IO單位
一般來講, Oracle block 大小是8k, 也可設成12k, 16k等....
可以用show parameter block; 來查看當前數(shù)據(jù)庫的Blocksize.
也就是說Oracle dbf被分成了很多個大小為8k的小塊
而Block是Oracle最小的磁盤IO單位.
點講咧~
?????? 其實我們知道oracle是將數(shù)據(jù)存放在block中的, 一般情況下, 1個block能存儲對應表的多個數(shù)據(jù)行.? 而不會將1個數(shù)據(jù)行分開存放到多個blocks中, 除非這個數(shù)據(jù)行是在太大(行鏈接), 或者其他原因(行遷移)
??????? 假如這個時用戶要訪問這張表1條數(shù)據(jù)行的數(shù)據(jù),? 而且提交了sql語句, Oracle經(jīng)過計算,? 算出了這個數(shù)據(jù)行存放在哪個block中, 雖然這個block存放了多個數(shù)據(jù)行.? 但是Oracle并不會只訪問這1條數(shù)據(jù)行的數(shù)據(jù), 而是將整1個block從dbf文件中讀取到Data buffer cache中.
?????
如上圖,? 即使這個block有多個數(shù)據(jù)行的數(shù)據(jù), 但是為了讀取其中1行, oracle都會將整個block的數(shù)據(jù)讀入db buffer cache.
然后server process 會在database buffer cache的這個block的數(shù)據(jù)里提取出用戶想要的數(shù)據(jù)行, 并將其發(fā)送給用戶.
實際上, 當用戶修改了這個數(shù)據(jù)行, Oralce也會把緩存中整個block的數(shù)據(jù)一次寫入回DBF文件
所以講block是oracle的最小磁盤IO單位.
6. 同樣地, 對應dbf文件. sga里的 database buffer cache也被劃分成許多個小塊.
?????? 可以理解,在sga中, Database buffer cache就是用來專門用來緩存dbf文件的數(shù)據(jù)的,? 而dbf文件是1個1個block(最小IO單位)地被讀取入database buffer cache里的, 所以 database buffer cache也會被畫成對應的許多個小塊, 只不過這些塊在database buffer cache被稱為buffer, buffer的大小與block是一致的.
7. dababase buffer cache 的意義.
???? 其實意義有兩個
????? 1. 減少物理IO??????
????? 2. 構造CR塊
7. 1 減少IO
??????
????? 假如用戶要檢索一張表的第11條數(shù)據(jù)行, 那么Oracle經(jīng)過計算后, 第11條數(shù)據(jù)行在某個block中, 那么Oracle會執(zhí)行如下動作.
1. Oracle計算這條數(shù)據(jù)行在對應表數(shù)據(jù)段的哪1個block中.
2. 在內(nèi)存(database buffer cache)里找, 看看有沒有與那個block對應的buffer.
3. database buffer cache中沒有, 則Orocle會向操作系統(tǒng)發(fā)送1個物理IO請求.(沒有命中)
4. IO請求被發(fā)送到磁盤中,? Oracle會讀取dbf文件中讀取這個block, 放入db buffer cache中, 形成了與這個block對應的buffer(物理讀)
5. Oracle在database buffer cache中讀取這個buffer的對應行,并返回給用戶.(邏輯讀)
可以見到這個過程中發(fā)生了1次物理IO
??????? 這時,用戶又想查看第12行, Oracle經(jīng)過計算, 也算出了具體哪個block..
1. Oracle計算這條數(shù)據(jù)行在對應表數(shù)據(jù)段的哪1個block中.
2. 在內(nèi)存(database buffer cache)里找, 看看有沒有與那個block對應的buffer.
3. 這次找到了(11行和12行再同1個block中)(命中了),? 讀取這個buffer的對應行,并返回給用戶.(邏輯讀)
可見第二次讀取時,避免了物理讀.
7. 2 構造CR(consistent read)塊
這個跟事務有關了.
假如一張表T1 , 里面有兩行數(shù)據(jù),? 這兩行數(shù)據(jù)都存放在1個block中.
這時 有1個session 1 來訪問這張表的所有數(shù)據(jù)(select * from T1), 那么Oracle就會將這個block數(shù)據(jù)提取到database buffer cache中,形成1個buffer, 對應 session1 的 Server Process A就可以從這個buffer 中訪問表T1的數(shù)據(jù)了.
同時, 又有另1個session 2執(zhí)行同樣的語句(select * from T2), 那么server process B就可直接在database buffer cache 找到這個buffer, 這樣與session 1一樣,? server processB 也可以訪問這個buffer 找到T1的數(shù)據(jù).
如下圖:
????????? 好了,? 如果這時, session 1把 T1表其中的一行刪除了, 那么對應buffer的row1數(shù)據(jù)就清除掉, 但是session 1并沒有提交, 所以這個buffer就成了臟數(shù)據(jù)(嚴格來講, 即使session 1提交了, 但是DBWR未寫回數(shù)據(jù)文件, 這個buffer還是臟的,只有與數(shù)據(jù)文件數(shù)據(jù)1至才是干凈的).
????????? 根據(jù)事務的原則,? session2 再去查看這張表是, 還是 會見到row1 在表T1中的, 因為session 1并沒有提交嘛,? 所以session 2不不能去訪問這個被session 1修改后的buffer了.
如圖
?????????? 那么session2 是否會再一次從數(shù)據(jù)文件中把對應block數(shù)據(jù)放入database buffer cache中呢(物理讀)?
??????????
?????????? 1.不是這樣的, 因為session1 修改了數(shù)據(jù)的同時(刪除row1), 雖然并沒有commit,但是會產(chǎn)生undo log(撤銷日志).注意不是redo log(重做日志), 當commit之后就會產(chǎn)生redo log.
?
?????????? 2. 這時session去檢索這個buffer時, 發(fā)現(xiàn)數(shù)據(jù)已經(jīng)被更改.? 就會在database buffer cache申請多1個block size的空間, 并將被修改后buffer的數(shù)據(jù)copy一份放入這個新的buffer中.
????????? 3. 但是這個新的buffer數(shù)據(jù)還是跟舊的一樣啊, 也就是臟的啊, 所以session2 會從undo log中找回對應刪除row 1的數(shù)據(jù), 將這個新buff回滾到初始狀態(tài), 這樣session2 就能讀取這個新buffer了, 而這個新的buffer 就是CR 塊了(consistent read block). 而且避免了物理讀.
????????? 如下圖:
???????? 其實我們在這個流程中發(fā)現(xiàn) undo log有兩個作用, 第一就是幫助 session2 構造CR 塊, 提高數(shù)據(jù)庫并發(fā)性.
???????? 第二個作用也明顯, 當session1 后悔了, 不想提交這個改動, rollback的時候就會通過undo log把數(shù)據(jù)修改撤銷回到那個臟的buffer里啦.
http://v.youku.com/v_show/id_XMzkyMTk3ODM2.html
首先簡單說明一下Oracle數(shù)據(jù)庫的結構.
1. 數(shù)據(jù)庫的作用:
1.存儲數(shù)據(jù)
2.方便地檢索和處理數(shù)據(jù).
2.Oracle的簡單結構
1.存儲數(shù)據(jù)( Oracle 文件)
2.方便地檢索和處理數(shù)據(jù). (Oracle 實例)
可見對于Oracle數(shù)據(jù)庫來講, 數(shù)據(jù)都是存放在Oracle文件中的.
而前面章節(jié)也提到過,? Oracle文件分3大類,? 控制文件/ 數(shù)據(jù)文件/ 重做日志文件 --> 歸檔日志文件
實際上數(shù)據(jù)庫所有數(shù)據(jù)都存放在數(shù)據(jù)文件中的,?? 重做日志文件只不過是記錄了數(shù)據(jù)文件的數(shù)據(jù)變化,而不是數(shù)據(jù)文件的一份copy.
3. 數(shù)據(jù)文件的3層結構(block, extend, segment)
詳細可以參考我翻譯的官方文檔啦:
http://nvd11.blog.163.com/blog/static/200018312201282354948602/
下面是簡單介紹:
???? Oracle 的數(shù)據(jù)文件在物理上可以分3層結構,就是塊(block)/區(qū)(extend)/段(segment) 啦.
?其中最基本的單位是block
?而extend是由一段物理上連續(xù)的block組成的單位.
?segment是由若干個extend(無需物理連續(xù))的extend組成的.
大概結構如下圖:
?
如上圖,可以看出一個表空間內(nèi)有兩個數(shù)據(jù)文件, 里面3個extends組成1個數(shù)據(jù)段
仔細觀察可以分析出:
* 1個表空間可以有多個數(shù)據(jù)文件. 但1個數(shù)據(jù)文件只能存在于1個表空間內(nèi)(不能跨表空間)
* 在1個表空間內(nèi)每個block的大小是相同的
* 每個extend 都是由連續(xù)的blocks組成, 所以1個extend只能在1個數(shù)據(jù)文件中(不同數(shù)據(jù)文件中的block肯定不連續(xù)的啦).
* 1個segment 由若干個extends組成, 這些extends不必物理連續(xù), 所以segment可以跨數(shù)據(jù)文件保存.
* 1個segment只能存放在1個表空間內(nèi) , 不能跨表空間
一般來講, 一個segment就用來存放1張表或索引的數(shù)據(jù),? 如果這個segment是存放表的就叫數(shù)據(jù)段, 如果是存放索引的就叫索引段.
Oracle 1個segment只能存放在1個表空間內(nèi) ,是不是代表1張表不能跨表空間存放數(shù)據(jù)呢.
大部分表都是存放在1個表空間內(nèi)的,但是有例外, 這就是分區(qū)表.
有些表由于數(shù)據(jù)量實在過大,?? 可以根據(jù)一些規(guī)則(如地區(qū)), 分開存放在若干個表空間, 每個表空間中有1個(只能有1個)segment內(nèi)存放這個分區(qū)表的數(shù)據(jù). 這樣的話 檢索1個地區(qū)的數(shù)據(jù)就只訪問1個表空間內(nèi)的數(shù)據(jù)文件就ok了.
也就是說 分區(qū)表可以又多個segments組成,? 但是每1個segment都存放在不同的表空間中.
如下圖啦:
4,段區(qū)塊的分配
???? 當user建立一張表, Oracle就會為這種表分配1個數(shù)據(jù)段, 同時分配1個extend,???? 這張表的數(shù)據(jù)就存放在這個extend的blocks中,? 當其blocks用完時,? Oracle會重新1個extend到這個數(shù)據(jù)段,? 而不會單獨第分配個1個block.
5.Block是Oracle最少的磁盤IO單位
一般來講, Oracle block 大小是8k, 也可設成12k, 16k等....
可以用show parameter block; 來查看當前數(shù)據(jù)庫的Blocksize.
也就是說Oracle dbf被分成了很多個大小為8k的小塊
而Block是Oracle最小的磁盤IO單位.
點講咧~
?????? 其實我們知道oracle是將數(shù)據(jù)存放在block中的, 一般情況下, 1個block能存儲對應表的多個數(shù)據(jù)行.? 而不會將1個數(shù)據(jù)行分開存放到多個blocks中, 除非這個數(shù)據(jù)行是在太大(行鏈接), 或者其他原因(行遷移)
??????? 假如這個時用戶要訪問這張表1條數(shù)據(jù)行的數(shù)據(jù),? 而且提交了sql語句, Oracle經(jīng)過計算,? 算出了這個數(shù)據(jù)行存放在哪個block中, 雖然這個block存放了多個數(shù)據(jù)行.? 但是Oracle并不會只訪問這1條數(shù)據(jù)行的數(shù)據(jù), 而是將整1個block從dbf文件中讀取到Data buffer cache中.
?????
如上圖,? 即使這個block有多個數(shù)據(jù)行的數(shù)據(jù), 但是為了讀取其中1行, oracle都會將整個block的數(shù)據(jù)讀入db buffer cache.
然后server process 會在database buffer cache的這個block的數(shù)據(jù)里提取出用戶想要的數(shù)據(jù)行, 并將其發(fā)送給用戶.
實際上, 當用戶修改了這個數(shù)據(jù)行, Oralce也會把緩存中整個block的數(shù)據(jù)一次寫入回DBF文件
所以講block是oracle的最小磁盤IO單位.
6. 同樣地, 對應dbf文件. sga里的 database buffer cache也被劃分成許多個小塊.
?????? 可以理解,在sga中, Database buffer cache就是用來專門用來緩存dbf文件的數(shù)據(jù)的,? 而dbf文件是1個1個block(最小IO單位)地被讀取入database buffer cache里的, 所以 database buffer cache也會被畫成對應的許多個小塊, 只不過這些塊在database buffer cache被稱為buffer, buffer的大小與block是一致的.
7. dababase buffer cache 的意義.
???? 其實意義有兩個
????? 1. 減少物理IO??????
????? 2. 構造CR塊
7. 1 減少IO
??????
????? 假如用戶要檢索一張表的第11條數(shù)據(jù)行, 那么Oracle經(jīng)過計算后, 第11條數(shù)據(jù)行在某個block中, 那么Oracle會執(zhí)行如下動作.
1. Oracle計算這條數(shù)據(jù)行在對應表數(shù)據(jù)段的哪1個block中.
2. 在內(nèi)存(database buffer cache)里找, 看看有沒有與那個block對應的buffer.
3. database buffer cache中沒有, 則Orocle會向操作系統(tǒng)發(fā)送1個物理IO請求.(沒有命中)
4. IO請求被發(fā)送到磁盤中,? Oracle會讀取dbf文件中讀取這個block, 放入db buffer cache中, 形成了與這個block對應的buffer(物理讀)
5. Oracle在database buffer cache中讀取這個buffer的對應行,并返回給用戶.(邏輯讀)
可以見到這個過程中發(fā)生了1次物理IO
??????? 這時,用戶又想查看第12行, Oracle經(jīng)過計算, 也算出了具體哪個block..
1. Oracle計算這條數(shù)據(jù)行在對應表數(shù)據(jù)段的哪1個block中.
2. 在內(nèi)存(database buffer cache)里找, 看看有沒有與那個block對應的buffer.
3. 這次找到了(11行和12行再同1個block中)(命中了),? 讀取這個buffer的對應行,并返回給用戶.(邏輯讀)
可見第二次讀取時,避免了物理讀.
7. 2 構造CR(consistent read)塊
這個跟事務有關了.
假如一張表T1 , 里面有兩行數(shù)據(jù),? 這兩行數(shù)據(jù)都存放在1個block中.
這時 有1個session 1 來訪問這張表的所有數(shù)據(jù)(select * from T1), 那么Oracle就會將這個block數(shù)據(jù)提取到database buffer cache中,形成1個buffer, 對應 session1 的 Server Process A就可以從這個buffer 中訪問表T1的數(shù)據(jù)了.
同時, 又有另1個session 2執(zhí)行同樣的語句(select * from T2), 那么server process B就可直接在database buffer cache 找到這個buffer, 這樣與session 1一樣,? server processB 也可以訪問這個buffer 找到T1的數(shù)據(jù).
如下圖:
????????? 好了,? 如果這時, session 1把 T1表其中的一行刪除了, 那么對應buffer的row1數(shù)據(jù)就清除掉, 但是session 1并沒有提交, 所以這個buffer就成了臟數(shù)據(jù)(嚴格來講, 即使session 1提交了, 但是DBWR未寫回數(shù)據(jù)文件, 這個buffer還是臟的,只有與數(shù)據(jù)文件數(shù)據(jù)1至才是干凈的).
????????? 根據(jù)事務的原則,? session2 再去查看這張表是, 還是 會見到row1 在表T1中的, 因為session 1并沒有提交嘛,? 所以session 2不不能去訪問這個被session 1修改后的buffer了.
如圖
?????????? 那么session2 是否會再一次從數(shù)據(jù)文件中把對應block數(shù)據(jù)放入database buffer cache中呢(物理讀)?
??????????
?????????? 1.不是這樣的, 因為session1 修改了數(shù)據(jù)的同時(刪除row1), 雖然并沒有commit,但是會產(chǎn)生undo log(撤銷日志).注意不是redo log(重做日志), 當commit之后就會產(chǎn)生redo log.
?
?????????? 2. 這時session去檢索這個buffer時, 發(fā)現(xiàn)數(shù)據(jù)已經(jīng)被更改.? 就會在database buffer cache申請多1個block size的空間, 并將被修改后buffer的數(shù)據(jù)copy一份放入這個新的buffer中.
????????? 3. 但是這個新的buffer數(shù)據(jù)還是跟舊的一樣啊, 也就是臟的啊, 所以session2 會從undo log中找回對應刪除row 1的數(shù)據(jù), 將這個新buff回滾到初始狀態(tài), 這樣session2 就能讀取這個新buffer了, 而這個新的buffer 就是CR 塊了(consistent read block). 而且避免了物理讀.
????????? 如下圖:
???????? 其實我們在這個流程中發(fā)現(xiàn) undo log有兩個作用, 第一就是幫助 session2 構造CR 塊, 提高數(shù)據(jù)庫并發(fā)性.
???????? 第二個作用也明顯, 當session1 后悔了, 不想提交這個改動, rollback的時候就會通過undo log把數(shù)據(jù)修改撤銷回到那個臟的buffer里啦.
總結
以上是生活随笔為你收集整理的Oracle Buffer-cache (数据高速缓存)作用概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle 查看sql语句执行计划方法
- 下一篇: Oracle Database_buff