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