在Oracle 10g系統管理中,有一個自動SGA內存管理(ASMM)。下面介紹一下這個功能:
要使用自動管理,需要設置參數SGA_TARGET、STATISTICS_LEVEL(=TYPICAL或ALL,因為不支持統計集合,數據庫就沒有必要的歷史信息來確定大小)。在Oracle9i及以前版本中,只能用手動SGA內存管理,不存在參數SGA_TARGET,而且參數 SGA_MAX_SIZE只是一個上限,而不是動態目標,但10G中時SGA_TARGET設置不能超過它。
在Oracle 10g中,與內存相關的參數可以歸為兩類:
◆自動調優的SGA參數:目前這些參數包括DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE和Java_POOL_SIZE。
◆手動SGA參數:這些參數包括LOG_BUFFER、STREAMS_POOL、DB_NK_CACHE_SIZE、DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。
在Oracle 10g中,任何時候你都能查詢V$SGAINFO,來查看SGA的哪些組件的大小可以調整。(Oracle 10g系統管理相比之前的版本是大大增強了)
采用自動SGA內存管理時,確定自動調整組件大小的主要參數是SGA_TARGET,這個參數可以在數據庫啟動並運行時動態調整,最大可以達到SGA_MAX_SIZE參數設置的值(默認等於SGA_TARGET,所以如果想增加SGA_TARGET,就必須在啟動數據庫實例之前先把SGA_MAX_SIZE設置得大一些)。數據庫會使用SGA_TARGET值,再減去其他手動設置組件的大小(如DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE等),並使用計算得到的內存量來設置默認緩沖區池、共享池、大池和Java池的大小。在運行時,實例會根據需要動態地對這4個內存區分配和撤銷內存。
隨著時間的推移,當實例的內存需求越來越確定時,各個SGA組件的大小也越來越固定。即便數據庫關閉後又啟動,數據庫還能記得組件的大小,因此不必每次都從頭再來確定實例的正確大小。這是通過4個帶雙下劃線的參數做到的:__DB_CACHE_SIZE、__Java_POOL_SIZE、__LARGE_POOL_SIZE和__SHARED_POOL_SIZE。如果正常或立即關閉數據庫,則數據庫會把這些值記錄到存儲參數文件(SPFILE)中,並在啟動時再使用這些值來設置各個區的默認大小。
另外,如果知道4個區中某個區的最小值,那麼除了設置SGA_TARGET外,還可以設置這個參數。實例會使用你的設置作為下界(即這個區可能的最小大小),但是重要的一點要記住,這樣Oracle就不能縮小相應區的大小到設定的最小值以下了。
以上就對Oracle 10g系統管理中的自動SGA內存管理功能進行了簡單的介紹。