天天看點

Oracle體系結構之-記憶體結構

一、系統全局區(SGA)

系統全局區的資料被多個使用者共享。當資料庫執行個體啟動時,系統全局區記憶體被自動配置設定。SGA按作用的不同,又分為:資料緩沖區、日志緩沖區、共享池。

1. 資料緩沖區

資料緩沖區用于存儲從磁盤資料檔案中讀入的資料,供所有使用者共享。修改、插入的資料存儲在資料緩沖區中,修改完成或DBWR程序執行時,資料被寫入資料檔案。對于緩沖區中已經被修改但尚未寫入檔案的資料,我們稱之為“髒資料”。Oracle采用LRU(最近最少用)算法來管理資料緩沖區中的資料。

在9i之前,資料緩沖區的大小是由DB_BLOCK_BUFFER确定,之後的版本中,是由參數DB_CACHE_SIZE及DB_nK_CACHE_SIZE确定。

緩沖區的設定對性能影響是很突出的。設一個查詢要讀取的資料塊數為A,能夠從緩沖區讀取到的資料塊數為C,需要從磁盤讀取的資料塊數為D,那麼A+C+D稱為實體讀,則C/A稱為資料緩沖區的命中率。

補充:資料緩存區命中率計算公式

======================================================================

SQL> select  1 - ((physical.value - direct.value - lobs.value) / logical.value)  "Buffer Cache Hit Ratio" 

             from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstat logical

          where physical.name = 'physical reads'

              and direct.name='physical reads direct'

              and lobs.name='physical reads direct (lob)'

              and logical.name='session logical reads';

======================================================================

一般要求命中率在90%以上,如果命中率太低,就應适當調整資料緩沖區的大小。

2. 日志緩沖區

日志緩沖區用于緩沖事務日志,在适當的時候再由LGWR程序寫入日志檔案。日志緩沖區的大小由參數LOG_BUGGER設定。

補充:日志緩沖區失敗率計算公式

======================================================================

SQL> select name,gets,misses,immediate_gets,immediate_misses,

                       Decode(gets,0,0,misses/gets*100) ratio1,

                       Decode(immediate_gets+immediate_misses,0,0,

                                      immediate_misses/(immediate_gets+immediate_misses)*100) ratio2

              from v$latch

           where name in('redo allocation','redo copy');

======================================================================

其中,GETS、MISSES分别表示成功、失敗等待日志緩沖區的次數.IMMEDIATE_GETS表示成功立即得到日志緩沖區的次數.IMMEDIATE_MISSES表示未成功立即得到日志緩沖區的次數.

等待表示日志在進入日志緩沖區時因為日志緩沖區過小而沒有空閑空間,是以日志緩沖區的失敗率表示了日志緩沖區是否足夠大.不夠大時,使用者的日志寫将産生等待過程.對于日志緩存區的失敗率,應該小于1%.

3. 共享池

共享池是對sql,pl/sql程式進行文法分析,編譯,執行的記憶體區域。包括:庫緩沖區(library cache),資料字典緩沖區(data dictinary cache),使用者全局區(user global area)三個部分。

共享池的大小由參數shared_pool_size設定。

如果共享池設定過小,則運作SQL,PL/SQL 程式所占用的時間會較長,影響資料庫性能.對于共享池而言,要求某一個實體,如存儲過程等,盡可能駐留内在區域,增大程式運作的效率,減少重新分析與編譯的時間.

補充:資料字典成功/失敗次數統計

======================================================================

SQL> select sum(gets) 'dictionary gets',

                       sum(getmisses)  'dictionary cache getmisses'

              from v$rowcache;

======================================================================

其中,GETS表示讀取某一類資料字典時的成功次數.GETMISSES表示讀取某一類資料字典時的失敗次數.

補充:資料字典失敗/命中率計算公式

======================================================================

SQL> select parameter,gets,Getmisses,

                       getmisses/(gets+getmisses)*100 'miss ratio',

                       (1-(sum(getmisses)/(sum(gets)+sum(getmisses)))*100 "Hit ratio"

              from v$rowcache

           where gets+getmisses<>0

            group by parameter,gets,getmisses;

======================================================================

補充:庫緩存區命中率計算公式:

======================================================================

SQL>select sum(pins) "total pins",

                      sum(reloads) "total reloads",

                      sum(reloads)/sum(pins)*100 libcahe

            from v$librarycache;

======================================================================

緩存的失敗率應該在1%以下

二、程式全局區

程式全局區(PGA)是包含單個使用者或伺服器資料的控制資訊的記憶體區域。是在使用者程序連接配接到oracle資料庫并建立一個會話時,由oracle自動配置設定的。

PGA是非共享區,主要用于在程式設計時存儲變量與數組。會話結束時,PGA釋放。

三、排序區

排序區用于sql的order by。oracle優先使用排序區進行排序,如果記憶體不夠,oracle自動使用臨時表空間進行排序。

注:本文參考了CSDN網友方友松的技術Blog,作者的Blog位址為:http://blog.csdn.net/truexf/