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

pingyuan發表於2008-08-07
Oracle體系結構之-記憶體結構[@more@]一、系統全域性區(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/

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

相關文章