一、系統全域區(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/