Oracle 內(nèi)存結(jié)構(gòu)如下圖:

1:實例(Instance)
在一個中,每一個運行的Oracle數(shù)據(jù)庫都與一個數(shù)據(jù)庫實例相聯(lián)系,實例是我們
訪問數(shù)據(jù)庫的手段。
實例在操作系統(tǒng)中用ORACLE_SID來標(biāo)識,在Oracle中用參數(shù)INSTANCE_NAME來標(biāo)識,
它們兩個的值是相同的。數(shù)據(jù)庫啟動時,系統(tǒng)首先在內(nèi)存中分配系統(tǒng)全局區(qū)(SGA),
構(gòu)成了Oracle的內(nèi)存結(jié)構(gòu),然后啟動若干個常駐內(nèi)存的操作系統(tǒng)進程,即組成了Oracle的
進程結(jié)構(gòu),內(nèi)存區(qū)域和后臺進程合稱為一個Oracle實例。
數(shù)據(jù)庫與實例之間是1對1/n的關(guān)系,在非并行的數(shù)據(jù)庫系統(tǒng)中每個Oracle數(shù)據(jù)庫與一個
實例相對應(yīng);在并行的數(shù)據(jù)庫系統(tǒng)中,一個數(shù)據(jù)庫會對應(yīng)多個實例,同一時間用戶只與一個
實例相聯(lián)系,當(dāng)某一個實例出現(xiàn)故障時,其他實例自動服務(wù),保證數(shù)據(jù)庫正常運行。在任何
情況下,每個實例都只可以對應(yīng)一個數(shù)據(jù)庫。
2:Oracle 10g動態(tài)內(nèi)存管理
內(nèi)存是影響數(shù)據(jù)庫性能的重要因素,Oracle8i使用靜態(tài)內(nèi)存管理,Oracle 10g使用動態(tài)
內(nèi)存管理。所謂靜態(tài)內(nèi)存管理,就是在數(shù)據(jù)庫系統(tǒng)中,無論是否有用戶連接,也無論并發(fā)用
量大小,只要數(shù)據(jù)庫服務(wù)在運行,就會分配固定大小的內(nèi)存;動態(tài)內(nèi)存管理允許在數(shù)據(jù)庫服
務(wù)運行時對內(nèi)存的大小進行修改,讀取大數(shù)據(jù)塊時使用大內(nèi)存,小數(shù)據(jù)塊時使用小內(nèi)存,讀
取標(biāo)準(zhǔn)內(nèi)存塊時使用標(biāo)準(zhǔn)內(nèi)存設(shè)置。

按照系統(tǒng)對內(nèi)存使用方法的不同,Oracle數(shù)據(jù)庫的內(nèi)存可以分為以下幾個部分:
系統(tǒng)全局區(qū):SGA(System Global Area)
程序全局區(qū):PGA(Programe Global Area)
排序池:(Sort Area)
大池:(Large Pool)
池:( Pool)
2-1:系統(tǒng)全局區(qū)SGA(System Global Area)
SGA是一組為系統(tǒng)分配的共享的內(nèi)存結(jié)構(gòu),可以包含一個數(shù)據(jù)庫實例的數(shù)據(jù)或控制信
息。如果多個用戶連接到同一個數(shù)據(jù)庫實例,在實例的SGA中,數(shù)據(jù)可以被多個用戶共享。
當(dāng)數(shù)據(jù)庫實例啟動時,SGA的內(nèi)存被自動分配;當(dāng)數(shù)據(jù)庫實例關(guān)閉時,SGA內(nèi)存被回收。
SGA是占用內(nèi)存最大的一個區(qū)域,同時也是影響數(shù)據(jù)庫性能的重要因素。
SGA的有關(guān)信息可以通過下面的語句查詢,sga_max_size的大小是不可以動態(tài)調(diào)整的。
=====================================
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- --------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 164M
sga_target big integer 0
SQL> alter system set sga_max_size=100m;
alter system set sga_max_size=100m
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
======================================
系統(tǒng)全局區(qū)按作用不同可以分為:
數(shù)據(jù)緩沖區(qū)
日志緩沖區(qū)
共享池
2-1-1:數(shù)據(jù)緩沖區(qū)(Database Buffer Cache)
如果每次執(zhí)行一個操作時,Oracle都必須從磁盤讀取所有數(shù)據(jù)塊并在改變它之后
又必須把每一塊寫入磁盤,顯然效率會非常低。數(shù)據(jù)緩沖區(qū)存放需要經(jīng)常訪問的數(shù)據(jù),
供所有用戶使用。修改數(shù)據(jù)時,首先從數(shù)據(jù)文件中取出數(shù)據(jù),在數(shù)據(jù)緩沖區(qū)中,
修改/插入數(shù)據(jù)也在緩沖區(qū)中,commit或DBWR(下面有詳細(xì)介紹)進程的其他條
件引發(fā)時,數(shù)據(jù)被寫入數(shù)據(jù)文件。
數(shù)據(jù)緩沖區(qū)的大小是可以動態(tài)調(diào)整的,但是不能超過sga_max_size的限制。
======================================
SQL> show parameter db_cache_size
NAME TYPE VALUE
------------------------------------ ----------- -----------------
db_cache_size big integer 24M
SQL> alter system set db_cache_size=128m;
alter system set db_cache_size=128m
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00384: Insufficient memory to grow cache
SQL> alter system set db_cache_size=20m;
System altered.
SQL> show parameter db_cache_size;
NAME TYPE VALUE
------------------------------------ ----------- -----------------
db_cache_size big integer 20M
#此處我僅增加了1M都不行?
SQL> alter system set db_cache_size=25m;
alter system set db_cache_size=25m
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00384: Insufficient memory to grow cache
#修改顯示格式,方便查看。
SQL> column name format a40 wrap
SQL> column value format a20 wrap
#下面語句可以用來查看內(nèi)存空間分配情況,注意SGA各區(qū)大小總和。
SQL> select name,value from v$parameter where name like '%size' and value <> '0';
#先將java_pool_size調(diào)小,然后再修改db_cache_size
SQL> show parameter java_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- -----
java_pool_size big integer 48M
SQL> alter system set java_pool_size=20m;
System altered.
SQL> alter system set java_pool_size=30m;
System altered.
#上面說明SGA中各區(qū)大小總和不能超過sga_max_size。
=====================================
數(shù)據(jù)緩沖區(qū)的大小對數(shù)據(jù)庫的存區(qū)速度有直接影響,多用戶時尤為明顯。有些應(yīng)
用對速度要求很高,一般要求數(shù)據(jù)緩沖區(qū)的命中率在90%以上。
下面給出一種計算數(shù)據(jù)緩沖區(qū)命中率的方法:
使用數(shù)據(jù)字典v$sysstat
=====================================
SQL> select name, value from v$sysstat
2 where name in('session logical reads',
3 'physical reads',
4 'physical reads direct',
5 'physical reads direct (lob)')
NAME VALUE
------------------------------- ----------
session logical reads 895243
physical reads 14992
physical reads direct 34
physical reads direct (lob) 0
======================================
命中率=1-(14992-34-0)/895243
可以讓Oracle給出數(shù)據(jù)緩沖區(qū)大小的建議:
======================================
SQL> alter system set db_cache_advice=on;#打開該功能
System altered.
SQL> alter system set db_cache_advice=off;#關(guān)閉該功能
System altered.
======================================