Oracle物理體系總結

梓沐發表於2016-02-15
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的預處理主要有三點:
  • 儲存使用者的連線資訊,如會話屬性、繫結的變數等。
  • 儲存使用者許可權等重要資訊,當使用者程式與資料庫建立會話時,系統會將這個使用者的相關許可權查詢出來,然後儲存在這個會話區域內。
  • 當發起的指令需要排序時,如果PGA這個排序區,可以在記憶體中放下排序的尺寸,則在PGA記憶體中完成,如果放不下,超出的部分就在臨時表空間中完成排序,也就是在磁碟中完成排序。
5.使用者發起請求經歷的順序一般是PGA→SGA→DATABASE,或者PGA→SGA

二、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軍營的資料檔案區查詢皇上要的東西。如果查到了,就帶回資料緩衝區府,並由欽差大臣展現給皇上(前臺使用者),如果找不到,也只有就此覆命。

接下來做一個查詢
  1. --執行一條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

對比發現,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個假設中任有一個不成立,那麼最佳化器都將進行建立解析樹、生成執行計劃的動作。這個過程就叫硬解析

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29812844/viewspace-1988844/,如需轉載,請註明出處,否則將追究法律責任。

相關文章