Oracle物理體系總結
Oracle物理體系結構圖:http://blog.csdn.net/u011364306/article/details/50159729
一、概述
1.Oracle由例項和資料庫組成
2.例項是由共享記憶體區SGA(System Global Area)和一系列後臺程式組成,其中SGA最主要被劃分為共享池(shared pool) 、資料緩衝區(db cache)和日誌緩衝區(log buffer)三類。後臺程式包括PMON、SMON、LCKn、RECO、CKPT、DBWR、LGWR、ARCH等程式。
3.資料庫是由資料檔案、引數檔案、日誌檔案、控制檔案、歸檔檔案等系列檔案組成,其中歸檔檔案可能被轉移到新的儲存介質中,用於備份恢復使用。
4.PGA(Program Global Area)區,也是一塊開闢出來的記憶體區,和SGA的最明顯差別是,PGA不是共享記憶體,是私有不共享的。使用者對資料庫發起的無論查詢還是更新的任何操作,都是在PGA進行預處理,然後接下來才進入例項區域,由SGA和系列後臺程式共同完成使用者發起的請求。
PGA的預處理主要有三點:
二、Select 查詢原理
使用者執行執行一條簡單的查詢語句select objectid_name from t where object_id=29;,當發出一條SQL指令後,該SQL語句先從PGA進行準備工作,該SQL會立即匹配成一條唯一的HASH值
接下來該SQL指令進入SGA區進行處理,首先會敲開SGA區共享池的大門,該SQL會在共享池這個房間內查詢是否有什麼地方有儲存過這個SQL指令的身份證(即唯一的HASH值),如果沒有,那就要辛苦了,首先查詢自己的語句語法是否正確(比如from是否寫成了form)、語義是否正確(比如id欄位根本不存在)、是否有許可權,在這些都沒問題的情況下生成這條語句的身份證,這個SQL的唯一HASH值就被儲存下來。接下來開始進行解析,確定使用代價低的執行計劃。接下來這個執行計劃立即被儲存起來,並且和之前儲存的該SQL的身份證(HASH值)對應在一起。
接下來,該SQL的指令好比欽差大臣一樣,手持"執行計劃和要讀的資料"這個聖旨,繼續往前走,直奔“資料緩衝區”府內宣讀聖旨
資料緩衝區開門迎接跪謝天恩後,立即根據執行計劃去t表中查詢object_id值為29的寶物,但是所要的東西府內找不到,怎麼辦?資料緩衝區府只好傳令下去,八百里加急趕去偏遠的Database軍營的資料檔案區查詢皇上要的東西。如果查到了,就帶回資料緩衝區府,並由欽差大臣展現給皇上(前臺使用者),如果找不到,也只有就此覆命。
接下來做一個查詢
對比發現,2次雖然執行同一條語句,但是執行時間,遞迴呼叫等都有一定程度的不一樣。
1.使用者首次執行該SQL該指令,該指令從磁碟中獲取使用者連線資訊和相關許可權資訊許可權,並儲存在PGA裡。當使用者再次執行該命令時,由於Session之前未被斷開重連,連線資訊和相關許可權資訊就可以在PGA記憶體中直接獲取,避免了物理讀。
2.首次執行該SQL指令結束後,SGA記憶體區的共享池裡儲存了該SQL唯一指令HASH值,並保留了語法語意及執行計劃等相關解析動作的勞動成果,當再次執行該SQL時,由於該SQL指令的HASH值和共享池裡儲存的相匹配,所以之前的硬解析動作也就無需再做,不僅跳過了相關語法語意檢查,對於該選擇哪種執行計劃也無需考慮,直接拿來主義就好
3.首次執行該SQL命令時,資料一般不在SGA的資料快取區裡(除非被別的SQL讀入記憶體),只能從磁碟中獲取,不可避免的產生了物理讀,但是由於獲取後會儲存在資料緩衝區裡,再次執行就直接從資料緩衝區裡獲取了,完全避免了物理讀。
三、Update原理
sql語句:update t set object_id=92 where object_id=29;
1.如果該使用者並沒有退出原連結去新建立一個連線,PGA區的使用者連線資訊和許可權判斷等諸多動作依然不用做,否則需要完成使用者連線資訊和許可權判斷等諸多動作。
2.如果該語句是第一次執行,在共享池裡依然需要完成語法語意分析及解析,update t set object_id=92 where object_id=29指令中想匹配到object_id=29的記錄既可以用索引讀,也可以用全表掃描,到底選用哪種執行計劃需要根據代價的大小來判斷
3.接下來進入資料緩衝區,首次執行該資料不一定在緩衝區內,要先從磁碟中獲取到緩衝區中。
以上三點和之前的select objectid_name from t where object_id=29描述幾乎沒有任何本質區別,差異在於查詢語句做完這三步後,返回資料結果給使用者,就收工回家休息了。而更新語句的工作還要繼續。
4.在資料緩衝區內將object_id=29的記錄修改成object_id=92,修改完資料後,會啟用DBWR程式,完成更新的資料從資料記憶體中刷入到磁碟,將磁碟中的
object_id=29的值更新成92。因為磁碟才是真正儲存資料的地方,否則一斷電,資料在記憶體中就灰飛煙滅了。
四、日誌緩衝區(log buffer)
日誌緩衝區儲存了資料庫相關操作的日誌,記錄了這個動作,然後由LGWR後臺程式將其從日誌緩衝區這個記憶體區寫進磁碟的日誌檔案中,目的是為了便於將來出現異常情況時,可以根據日誌檔案中記錄的動作,再繼續執行一遍,從而保證資料的安全。LGWR是連線日誌緩衝區和日誌檔案的辛勤工作者。
當對Update語句進行Commit操作後,資料並不會立即輸入到磁碟中的,而是進行批次刷出的。Oracle中一旦發生Commit時,日誌緩衝區會把操作的動作(並非結果)寫入到磁碟的日誌檔案中,這樣Oracle就不一定非要將資料從資料緩衝區寫入到磁碟中了。磁碟的日誌檔案不是記憶體中的日誌緩衝區,是永久儲存不怕斷電的,斷電以後會依據磁碟的日誌檔案重新操作一次,把剛才的資料緩衝區丟失的資料恢復。因此資料緩衝區批次刷出的效率和安全是可以保證的。
資料庫在執行過程中,批次刷出的資料佔資料緩衝區的比例越大,效率一般來說是越高,而且不用擔心斷電後的恢復問題。但是這樣資料庫斷電重啟後的恢復資料動作必須需要更長,因此存在一個平衡的問題:批次刷出的量越小,Oracle效能就會降低,但是斷電後開機恢復的時間就更短,反之批次刷出的量越大,Oracle效能就更高,但是斷電後恢復的時間就越長,因此引入一個後臺程式的新成員:CKPT
五、檢查點(CKPT)
資料緩衝區資料寫到磁碟的動作正是由程式CKPT來出發的,CKPT觸發DBWR寫出。這是一個相當重要的程式,我們可以透過設定引數來調整控制CKPT的出發時間,
硬解析(hard prase)和軟解析(soft prase):
在執行和獲取結果前,資料庫系統對此sql將進行幾個步驟的處理過程:
1、語法檢查(syntax check)
檢查此sql的拼寫是否語法。
2、語義檢查(semantic check)
諸如檢查sql語句中的訪問物件是否存在及該使用者是否具備相應的許可權。
3、對sql語句進行解析(prase)
利用內部演算法對sql進行解析,生成解析樹(parse tree)及執行計劃(execution plan)。
4、執行sql,返回結果(execute and return)
其中,軟、硬解析就發生在第三個過程裡。
資料庫利用內部的hash演算法來取得該sql的hash值,然後在library cache裡查詢是否存在該hash值。假設存在,則將此sql與cache中的進行比較。假設“相同”,就將利用已有的解析樹與執行計劃,而省略了最佳化器的相關工作。這也就是軟解析的過程。
誠然,如果上面的2個假設中任有一個不成立,那麼最佳化器都將進行建立解析樹、生成執行計劃的動作。這個過程就叫硬解析
一、概述
1.Oracle由例項和資料庫組成
2.例項是由共享記憶體區SGA(System Global Area)和一系列後臺程式組成,其中SGA最主要被劃分為共享池(shared pool) 、資料緩衝區(db cache)和日誌緩衝區(log buffer)三類。後臺程式包括PMON、SMON、LCKn、RECO、CKPT、DBWR、LGWR、ARCH等程式。
3.資料庫是由資料檔案、引數檔案、日誌檔案、控制檔案、歸檔檔案等系列檔案組成,其中歸檔檔案可能被轉移到新的儲存介質中,用於備份恢復使用。
4.PGA(Program Global Area)區,也是一塊開闢出來的記憶體區,和SGA的最明顯差別是,PGA不是共享記憶體,是私有不共享的。使用者對資料庫發起的無論查詢還是更新的任何操作,都是在PGA進行預處理,然後接下來才進入例項區域,由SGA和系列後臺程式共同完成使用者發起的請求。
PGA的預處理主要有三點:
- 儲存使用者的連線資訊,如會話屬性、繫結的變數等。
- 儲存使用者許可權等重要資訊,當使用者程式與資料庫建立會話時,系統會將這個使用者的相關許可權查詢出來,然後儲存在這個會話區域內。
- 當發起的指令需要排序時,如果PGA這個排序區,可以在記憶體中放下排序的尺寸,則在PGA記憶體中完成,如果放不下,超出的部分就在臨時表空間中完成排序,也就是在磁碟中完成排序。
二、Select 查詢原理
使用者執行執行一條簡單的查詢語句select objectid_name from t where object_id=29;,當發出一條SQL指令後,該SQL語句先從PGA進行準備工作,該SQL會立即匹配成一條唯一的HASH值
接下來該SQL指令進入SGA區進行處理,首先會敲開SGA區共享池的大門,該SQL會在共享池這個房間內查詢是否有什麼地方有儲存過這個SQL指令的身份證(即唯一的HASH值),如果沒有,那就要辛苦了,首先查詢自己的語句語法是否正確(比如from是否寫成了form)、語義是否正確(比如id欄位根本不存在)、是否有許可權,在這些都沒問題的情況下生成這條語句的身份證,這個SQL的唯一HASH值就被儲存下來。接下來開始進行解析,確定使用代價低的執行計劃。接下來這個執行計劃立即被儲存起來,並且和之前儲存的該SQL的身份證(HASH值)對應在一起。
接下來,該SQL的指令好比欽差大臣一樣,手持"執行計劃和要讀的資料"這個聖旨,繼續往前走,直奔“資料緩衝區”府內宣讀聖旨
資料緩衝區開門迎接跪謝天恩後,立即根據執行計劃去t表中查詢object_id值為29的寶物,但是所要的東西府內找不到,怎麼辦?資料緩衝區府只好傳令下去,八百里加急趕去偏遠的Database軍營的資料檔案區查詢皇上要的東西。如果查到了,就帶回資料緩衝區府,並由欽差大臣展現給皇上(前臺使用者),如果找不到,也只有就此覆命。
接下來做一個查詢
-
--執行一條select語句
SQL> select object_name from t where object_id=29;
Elapsed: 00:00:00.03
Statistics
----------------------------------------------------------
4 recursive calls
0 db block gets
1306 consistent gets
1239 physical reads
0 redo size
532 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
--再次執行該語句
SQL> select object_name from t where object_id=29;
Elapsed: 00:00:00.01
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1243 consistent gets
0 physical reads
0 redo size
532 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
1.使用者首次執行該SQL該指令,該指令從磁碟中獲取使用者連線資訊和相關許可權資訊許可權,並儲存在PGA裡。當使用者再次執行該命令時,由於Session之前未被斷開重連,連線資訊和相關許可權資訊就可以在PGA記憶體中直接獲取,避免了物理讀。
2.首次執行該SQL指令結束後,SGA記憶體區的共享池裡儲存了該SQL唯一指令HASH值,並保留了語法語意及執行計劃等相關解析動作的勞動成果,當再次執行該SQL時,由於該SQL指令的HASH值和共享池裡儲存的相匹配,所以之前的硬解析動作也就無需再做,不僅跳過了相關語法語意檢查,對於該選擇哪種執行計劃也無需考慮,直接拿來主義就好
3.首次執行該SQL命令時,資料一般不在SGA的資料快取區裡(除非被別的SQL讀入記憶體),只能從磁碟中獲取,不可避免的產生了物理讀,但是由於獲取後會儲存在資料緩衝區裡,再次執行就直接從資料緩衝區裡獲取了,完全避免了物理讀。
三、Update原理
sql語句:update t set object_id=92 where object_id=29;
1.如果該使用者並沒有退出原連結去新建立一個連線,PGA區的使用者連線資訊和許可權判斷等諸多動作依然不用做,否則需要完成使用者連線資訊和許可權判斷等諸多動作。
2.如果該語句是第一次執行,在共享池裡依然需要完成語法語意分析及解析,update t set object_id=92 where object_id=29指令中想匹配到object_id=29的記錄既可以用索引讀,也可以用全表掃描,到底選用哪種執行計劃需要根據代價的大小來判斷
3.接下來進入資料緩衝區,首次執行該資料不一定在緩衝區內,要先從磁碟中獲取到緩衝區中。
以上三點和之前的select objectid_name from t where object_id=29描述幾乎沒有任何本質區別,差異在於查詢語句做完這三步後,返回資料結果給使用者,就收工回家休息了。而更新語句的工作還要繼續。
4.在資料緩衝區內將object_id=29的記錄修改成object_id=92,修改完資料後,會啟用DBWR程式,完成更新的資料從資料記憶體中刷入到磁碟,將磁碟中的
object_id=29的值更新成92。因為磁碟才是真正儲存資料的地方,否則一斷電,資料在記憶體中就灰飛煙滅了。
四、日誌緩衝區(log buffer)
日誌緩衝區儲存了資料庫相關操作的日誌,記錄了這個動作,然後由LGWR後臺程式將其從日誌緩衝區這個記憶體區寫進磁碟的日誌檔案中,目的是為了便於將來出現異常情況時,可以根據日誌檔案中記錄的動作,再繼續執行一遍,從而保證資料的安全。LGWR是連線日誌緩衝區和日誌檔案的辛勤工作者。
當對Update語句進行Commit操作後,資料並不會立即輸入到磁碟中的,而是進行批次刷出的。Oracle中一旦發生Commit時,日誌緩衝區會把操作的動作(並非結果)寫入到磁碟的日誌檔案中,這樣Oracle就不一定非要將資料從資料緩衝區寫入到磁碟中了。磁碟的日誌檔案不是記憶體中的日誌緩衝區,是永久儲存不怕斷電的,斷電以後會依據磁碟的日誌檔案重新操作一次,把剛才的資料緩衝區丟失的資料恢復。因此資料緩衝區批次刷出的效率和安全是可以保證的。
資料庫在執行過程中,批次刷出的資料佔資料緩衝區的比例越大,效率一般來說是越高,而且不用擔心斷電後的恢復問題。但是這樣資料庫斷電重啟後的恢復資料動作必須需要更長,因此存在一個平衡的問題:批次刷出的量越小,Oracle效能就會降低,但是斷電後開機恢復的時間就更短,反之批次刷出的量越大,Oracle效能就更高,但是斷電後恢復的時間就越長,因此引入一個後臺程式的新成員:CKPT
五、檢查點(CKPT)
資料緩衝區資料寫到磁碟的動作正是由程式CKPT來出發的,CKPT觸發DBWR寫出。這是一個相當重要的程式,我們可以透過設定引數來調整控制CKPT的出發時間,
硬解析(hard prase)和軟解析(soft prase):
在執行和獲取結果前,資料庫系統對此sql將進行幾個步驟的處理過程:
1、語法檢查(syntax check)
檢查此sql的拼寫是否語法。
2、語義檢查(semantic check)
諸如檢查sql語句中的訪問物件是否存在及該使用者是否具備相應的許可權。
3、對sql語句進行解析(prase)
利用內部演算法對sql進行解析,生成解析樹(parse tree)及執行計劃(execution plan)。
4、執行sql,返回結果(execute and return)
其中,軟、硬解析就發生在第三個過程裡。
資料庫利用內部的hash演算法來取得該sql的hash值,然後在library cache裡查詢是否存在該hash值。假設存在,則將此sql與cache中的進行比較。假設“相同”,就將利用已有的解析樹與執行計劃,而省略了最佳化器的相關工作。這也就是軟解析的過程。
誠然,如果上面的2個假設中任有一個不成立,那麼最佳化器都將進行建立解析樹、生成執行計劃的動作。這個過程就叫硬解析
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29812844/viewspace-1988844/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle體系結構之-物理結構Oracle
- oracle體系結構總結Oracle
- Oracle Data block 的物理結構-體系架構OracleBloC架構
- Oracle 體系結構 SGA 和PGA 總結Oracle
- oracle 體系 & hints的用法總結(轉)Oracle
- 體系總結
- oracle體系結構Oracle
- ORACLE體系結構小結Oracle
- 總結11g 物理data guard
- Oracle OCP(38):Database 物理結構OracleDatabase
- oracle物理儲存結構理解Oracle
- Oracle Data block 的物理結構OracleBloC
- 基於物理的渲染(PBR)白皮書(一):PBR核心知識體系總結與概覽
- oracle體系結構(轉)Oracle
- ORACLE-體系結構Oracle
- Oracle體系結構梳理Oracle
- Oracle 體系結構圖Oracle
- oracle體系結構(1)Oracle
- oracle體系結構(2)Oracle
- oracle體系結構(3)Oracle
- Oracle記憶體體系結構Oracle記憶體
- Oracle JDE 系統架構總結..Oracle架構
- Oracle體系結構之-記憶體結構Oracle記憶體
- 如何學好高中物理方法總結
- 26_Oracle redo物理結構解析Oracle Redo
- Oracle體系結構部落格連結Oracle
- 架構知識體系總結架構
- oracle體系結構概覽Oracle
- Oracle 體系結構介紹Oracle
- 【Oracle體系結構】 Oracle19C 系統結構介紹Oracle
- mysql物理結構-日誌系統MySql
- Oracle 總結Oracle
- 3:Oracle體系結構(邏輯結構)Oracle
- Oracle系列:Oracle RAC叢集體系結構Oracle
- Oracle體系結構之-Oracle後臺程式Oracle
- [ADMIN]oracle入門-oracle體系結構Oracle
- Oracle體系結構之記憶體結構(SGA、PGA)Oracle記憶體
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體