Oracle 10g內(nèi)存結(jié)構(gòu)之排序區(qū)和Java池的相關(guān)知識簡介
之前我們介紹了:Oracle 10g內(nèi)存結(jié)構(gòu)之共享池的相關(guān)知識及使用簡介,本文我們接著介紹一下剩余的部分,包括:程序全局區(qū)、排序區(qū)、Java池等的相關(guān)知識,接下來我們就開始介紹這部分內(nèi)容。
程序全局區(qū)
程序全局區(qū)是包含單個用戶或服務(wù)器數(shù)據(jù)和控制信息的內(nèi)存區(qū)域。程序全局區(qū)是用戶進(jìn)程連接到oracle數(shù)據(jù)庫并創(chuàng)建一個會話時,由oracle自動分配的。與sga不同,pga 并非共享區(qū),主要用于用戶在編程時存儲變量和數(shù)組。該區(qū)域中 STACK SPACE 是用于存儲用戶會話的變量和數(shù)組的存儲區(qū)域,USER SESSION DATA 是用戶會話使用的附加區(qū)域。用戶會話結(jié)束pga 釋放。
排序區(qū)
Sort Area 是為有排序請求的sal 語句提供內(nèi)存空間,系統(tǒng)使用專用的內(nèi)存區(qū)域進(jìn)行數(shù)據(jù)排序,這部分空間就稱為排序區(qū),用戶數(shù)據(jù)的排序可以分為兩個一個是內(nèi)存排序區(qū),另外一個是磁盤臨時段。系統(tǒng)優(yōu)先使用內(nèi)存排序區(qū)進(jìn)行排序。如果內(nèi)存不夠,oracle自動使用磁盤臨時段表空間進(jìn)行排序。
要了解排序區(qū)的大小,可以查看 sort_area_size 方法如下:
參數(shù)文件:
- ….
- Compatible = 8.1.0
- Sort_area_size = 65536
- Sort_area_retained_size = 65536
- …..
方法二:
- SQL>select name,value from v$parameter where name like ‘%size’;
方法三:
- SQL> show parameter sort_area_size
如果要了解數(shù)據(jù)庫中排序區(qū)的使用情況,確認(rèn)在內(nèi)存排序量與磁盤排序量,可以查詢數(shù)據(jù)字典v$sysstat
SQL> select name,value from v$sysstat where name like ‘%sort%’;
大池
大池(large pool)用于數(shù)據(jù)庫備份工具—恢復(fù)管理器(rman)
大池的參數(shù)由large_pool_size 確定。
查詢該值的方法有三,這里介紹其中一個方法:
SQL> show parameter large_pool_size
Java 池
參數(shù)java_pool_size 大小應(yīng)該不小于20M。
Oracle10g自動共享內(nèi)存管理
在oracle 中 將參數(shù)STSTISTICS_LEVEL 設(shè)置為 TYPICAL(默認(rèn))或ALL,使用新參數(shù)SGA_TARGET 指出SGA內(nèi)存分配總大小即可,不需要定義SHAR_POOL_SIZE DB_CACHE_SIZE 等參數(shù),數(shù)據(jù)庫服務(wù)器會自動根據(jù)需要動態(tài)分配。 注意如果沒有sga_targe ,則自動共享內(nèi)存管理功能被禁止,仍然可以設(shè)置每個參數(shù)。在設(shè)置了SGA_TARGET 后,其他參數(shù)默認(rèn)設(shè)置為0。
自動恭喜內(nèi)存管理時設(shè)置內(nèi)存參數(shù)的最小值限制:如果數(shù)據(jù)庫管理員了解某一個應(yīng)用所需的內(nèi)存大小,就可以為內(nèi)存組件指定最小值。最小值可以用相應(yīng)的參數(shù)進(jìn)行設(shè)置,例如:
- SGA_TARGET= 256m
- SHARE_POOL_SIZE= 32M
- DB_CACHE_SIZE = 100M
即在自動分配時,共享池及數(shù)據(jù)緩沖區(qū)的值不得小于32m 和 100m ,其余的124m 內(nèi)存將分配給其他組件??梢圆樵償?shù)據(jù)字典 v$sga_dynamic_components 了解各個組件的分配值。
當(dāng)啟動自動共享內(nèi)存管理的功能后,對于自動設(shè)置的參數(shù)也可以手動設(shè)置,例如SHARE_POOL_SIZE 如果為sga 組件參數(shù)設(shè)置了比較小的值,則不會立即起作用,例如:如果設(shè)置參數(shù)SGA_TARGET = 512M ,SHARE_POOL_SIZE = 256M 而當(dāng)前共享池為284M,如果dba 動態(tài)減少SHARE_POOL_SIZE的值,使之低于256M或更低的值時將不起作用。如果參數(shù)值超過當(dāng)前組件值,則組件的值也隨之增加,如果SHARE_POOL_SIZE的值為300M,則共享池增加到300M。
在自動管理內(nèi)存時,當(dāng)參數(shù)的取值增加時,則用于自動調(diào)整地額外內(nèi)存就減少,反之亦然。
此外,一些sga參數(shù)必須由數(shù)據(jù)庫管理員設(shè)置,系統(tǒng)將不進(jìn)行自動調(diào)整。這些參數(shù)包括:
- LOG_BUFFER
- DB_KEEP_CACHE_SIZE
- DB_RECYCLE_CACHE_SIZE
- DB_nK_CACHE_SIZE
- STREAMS_POOL_SIZE
這些參數(shù)設(shè)置后將影響到其他參數(shù)的自動分配,(可用內(nèi)存變化)。
手動內(nèi)存管理轉(zhuǎn)到自動內(nèi)存管理
如果要從手動內(nèi)存管理轉(zhuǎn)到自動內(nèi)存管理,只需要增加參數(shù)SGA_TARGET即可。首先,計算出SGA各個參數(shù)的取值,再加上16M(fixed SGA overhead),即可得到SGA總大小。然后從參數(shù)文件中將內(nèi)存各個組件的值取消。例如:
- SHARE_POOL_SIZE = 256M
- DB_CACHE_SIZE = 512M
- LARGE_POOL_SIZE = 256M
- LOG_BUFFER = 16M
則SGA_TARGET = 256+512+256+16+16 =1056M,也可以查詢數(shù)據(jù)字典得到:
- SQL> select ( ( select sum(value) from v$sga ) – (select current_size from v$ sga_dynamic_free_memory ) ) “sga_target” from dual;
又例如:如果一個手動管理的實例SGA_MAX_SIZE = 1200M 其中
- SHARE_POOL_SIZE = 200M
- DB_CACHE_SIZE = 500M
- LARGE_POOL_SIZE = 200M
查詢結(jié)果如下:
- SQL> select sum(value) from v$sga ; 結(jié)果為1200m
- SQL> select current_size from v$sga_dynamic_free_memory ;
結(jié)果為208M。
則SGA_TARGET =1200 – 208 = 902M。
從參數(shù)文件取消SHARE_POOL_SIZE DB_CACHE_SIZE LARGE_POOL_SIZE
在自動內(nèi)存管理方式下,如果數(shù)據(jù)庫適用spfile ,那么數(shù)據(jù)庫關(guān)閉后,系統(tǒng)激昂上一次數(shù)據(jù)庫關(guān)閉時的狀態(tài)記錄下來,經(jīng)過調(diào)整后的內(nèi)存參數(shù)的各個組件的值將保存在參數(shù)文件中,所以如果使用自動內(nèi)存管理,最好使用spfile。
關(guān)于Oracle 10g內(nèi)存結(jié)構(gòu)之排序區(qū)和Java池的相關(guān)知識就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@。
【編輯推薦】






