Oracle 記憶體結構和程序結構
Oracle 記憶體結構如下圖:
1:例項(Instance)
在一箇中,每一個執行的Oracle資料庫都與一個數據庫例項相聯絡,例項是我們
訪問資料庫的手段。
例項在作業系統中用ORACLE_SID來標識,在Oracle中用引數INSTANCE_NAME來標識,
它們兩個的值是相同的。資料庫啟動時,系統首先在記憶體中分配系統全域性區(SGA),
構成了Oracle的記憶體結構,然後啟動若干個常駐記憶體的作業系統程序,即組成了Oracle的
程序結構,記憶體區域和後臺程序合稱為一個Oracle例項。
資料庫與例項之間是1對1/n的關係,在非並行的資料庫系統中每個Oracle資料庫與一個
例項相對應;在並行的資料庫系統中,一個數據庫會對應多個例項,同一時間使用者只與一個
例項相聯絡,當某一個例項出現故障時,其他例項自動服務,保證資料庫正常執行。在任何
情況下,每個例項都只可以對應一個數據庫。
2:Oracle 10g動態記憶體管理
記憶體是影響資料庫效能的重要因素,Oracle8i使用靜態記憶體管理,Oracle 10g使用動態
記憶體管理。所謂靜態記憶體管理,就是在資料庫系統中,無論是否有使用者連線,也無論併發用
量大小,只要資料庫服務在執行,就會分配固定大小的記憶體;動態記憶體管理允許在資料庫服
務執行時對記憶體的大小進行修改,讀取大資料塊時使用大記憶體,小資料塊時使用小記憶體,讀
取標準記憶體塊時使用標準記憶體設定。
按照系統對記憶體使用方法的不同,Oracle資料庫的記憶體可以分為以下幾個部分:
•系統全域性區:SGA(System Global Area)
•程式全域性區:PGA(Programe Global Area)
•排序池:(Sort Area)
•大池:(Large Pool)
•池:( Pool)
2-1:系統全域性區SGA(System Global Area)
SGA是一組為系統分配的共享的記憶體結構,可以包含一個數據庫例項的資料或控制信
息。如果多個使用者連線到同一個資料庫例項,在例項的SGA中,資料可以被多個使用者共享。
當資料庫例項啟動時,SGA的記憶體被自動分配;當資料庫例項關閉時,SGA記憶體被回收。
SGA是佔用記憶體最大的一個區域,同時也是影響資料庫效能的重要因素。
SGA的有關資訊可以通過下面的語句查詢,sga_max_size的大小是不可以動態調整的。
=====================================
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
======================================
系統全域性區按作用不同可以分為:
•資料緩衝區
•日誌緩衝區
•共享池
2-1-1:資料緩衝區(Database Buffer Cache)
如果每次執行一個操作時,Oracle都必須從磁碟讀取所有資料塊並在改變它之後
又必須把每一塊寫入磁碟,顯然效率會非常低。資料緩衝區存放需要經常訪問的資料,
供所有使用者使用。修改資料時,首先從資料檔案中取出資料,在資料緩衝區中,
修改/插入資料也在緩衝區中,commit或DBWR(下面有詳細介紹)程序的其他條
件引發時,資料被寫入資料檔案。
資料緩衝區的大小是可以動態調整的,但是不能超過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
#下面語句可以用來檢視記憶體空間分配情況,注意SGA各區大小總和。
SQL> select name,value from v$parameter where name like '%size' and value <> '0';
#先將java_pool_size調小,然後再修改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中各區大小總和不能超過sga_max_size。
=====================================
資料緩衝區的大小對資料庫的存區速度有直接影響,多使用者時尤為明顯。有些應
用對速度要求很高,一般要求資料緩衝區的命中率在90%以上。
下面給出一種計算資料緩衝區命中率的方法:
•使用資料字典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給出資料緩衝區大小的建議:
======================================
SQL> alter system set db_cache_advice=on;#開啟該功能
System altered.
SQL> alter system set db_cache_advice=off;#關閉該功能
System altered.
======================================