程序全局區
程序全局區是包含單個用戶或服務器數據和控制信息的內存區域。程序全局區是用戶進程連接到Oracle數據庫並創建一個會話時,由Oracle自動分配的。與sga不同,pga 並非共享區,主要用於用戶在編程時存儲變量和數組。該區域中 STACK SPACE 是用於存儲用戶會話的變量和數組的存儲區域,USER SESSION DATA 是用戶會話使用的附加區域。用戶會話結束pga 釋放。
排序區
Sort Area 是為有排序請求的sal 語句提供內存空間,系統使用專用的內存區域進行數據排序,這部分空間就稱為排序區,用戶數據的排序可以分為兩個一個是內存排序區,另外一個是磁盤臨時段。系統優先使用內存排序區進行排序。如果內存不夠,Oracle自動使用磁盤臨時段表空間進行排序。
要了解排序區的大小,可以查看 sort_area_size 方法如下:
參數文件:
- ….
- 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
如果要了解數據庫中排序區的使用情況,確認在內存排序量與磁盤排序量,可以查詢數據字典v$sysstat
SQL> select name,value from v$sysstat where name like ‘%sort%’;
大池
大池(large pool)用於數據庫備份工具—恢復管理器(rman)
大池的參數由large_pool_size 確定。
查詢該值的方法有三,這裡介紹其中一個方法:
SQL> show parameter large_pool_size
Java 池
參數Java_pool_size 大小應該不小於20M。
Oracle10g自動共享內存管理
在Oracle 中 將參數STSTISTICS_LEVEL 設置為 TYPICAL(默認)或ALL,使用新參數SGA_TARGET 指出SGA內存分配總大小即可,不需要定義SHAR_POOL_SIZE DB_CACHE_SIZE 等參數,數據庫服務器會自動根據需要動態分配。 注意如果沒有sga_targe ,則自動共享內存管理功能被禁止,仍然可以設置每個參數。在設置了SGA_TARGET 後,其他參數默認設置為0。
自動恭喜內存管理時設置內存參數的最小值限制:如果數據庫管理員了解某一個應用所需的內存大小,就可以為內存組件指定最小值。最小值可以用相應的參數進行設置,例如:
- SGA_TARGET= 256m
- SHARE_POOL_SIZE= 32M
- DB_CACHE_SIZE = 100M
即在自動分配時,共享池及數據緩沖區的值不得小於32m 和 100m ,其余的124m 內存將分配給其他組件。可以查詢數據字典 v$sga_dynamic_components 了解各個組件的分配值。
當啟動自動共享內存管理的功能後,對於自動設置的參數也可以手動設置,例如SHARE_POOL_SIZE 如果為sga 組件參數設置了比較小的值,則不會立即起作用,例如:如果設置參數SGA_TARGET = 512M ,SHARE_POOL_SIZE = 256M 而當前共享池為284M,如果dba 動態減少SHARE_POOL_SIZE的值,使之低於256M或更低的值時將不起作用。如果參數值超過當前組件值,則組件的值也隨之增加,如果SHARE_POOL_SIZE的值為300M,則共享池增加到300M。
在自動管理內存時,當參數的取值增加時,則用於自動調整地額外內存就減少,反之亦然。
此外,一些sga參數必須由數據庫管理員設置,系統將不進行自動調整。這些參數包括:
這些參數設置後將影響到其他參數的自動分配,(可用內存變化)。
手動內存管理轉到自動內存管理
如果要從手動內存管理轉到自動內存管理,只需要增加參數SGA_TARGET即可。首先,計算出SGA各個參數的取值,再加上16M(fixed SGA overhead),即可得到SGA總大小。然後從參數文件中將內存各個組件的值取消。例如:
則SGA_TARGET = 256+512+256+16+16 =1056M,也可以查詢數據字典得到:
- 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
查詢結果如下:
- SQL> select sum(value) from v$sga ; 結果為1200m
- SQL> select current_size from v$sga_dynamic_free_memory ;
結果為208M。
則SGA_TARGET =1200 – 208 = 902M。
從參數文件取消SHARE_POOL_SIZE DB_CACHE_SIZE LARGE_POOL_SIZE
在自動內存管理方式下,如果數據庫適用spfile ,那麼數據庫關閉後,系統激昂上一次數據庫關閉時的狀態記錄下來,經過調整後的內存參數的各個組件的值將保存在參數文件中,所以如果使用自動內存管理,最好使用spfile。
關於Oracle 10g內存結構之排序區和Java池的相關知識就介紹到這裡了,希望本次的介紹能夠對您有所收獲。