在Oracle9i以前的版本中,你只能在啟動資料庫的時候控制Oracle使用的UNIX記憶體。Oracle提供了一些INIT.ORA參數來檢測系統全域區(system global area,SGA)的RAM大小。一旦啟動了資料庫,你將不能再改變SGA的大小和配置。
Oracle向一個24/7資料庫邁進的目標,提出了調整UNIX記憶體區的大小而不必停止和重啟資料庫的要求。更重要的是,Oracle9i的動態SGA特性允許你監控SGA內的實體記憶體使用,並根據現有的Oracle資料庫的需求調整SGA記憶體地區。
Oracle9i還加入了一項新的記憶體管理技術,使得你能夠為所有的程式全域區(program global area,PGA)預分配記憶體,並允許Oracle按照各類串連的不同需求為各串連分配記憶體。這是對傳統Oracle資料庫的一項相當激進的更改,而且使得SORT_AREA_SIZE和其他PGA參數被廢棄。
不僅要分配SGA,Oracle9i DBA還必須擔負為UNIX Oracle伺服器分配所有記憶體的責任,同時還要為UNIX的管理需要預留20%的記憶體。
在Oracle9i之前的版本中,同時擁有數個INIT.ORA參數檔案並不罕見,因為這樣可以方便地調整資料庫並重新設定SGA以改變運行模式。比如,為線上交易處理(online transaction processing,OLTP)而分配的SGA和Oracle資料倉儲處理模式的有很大不同。
Oracle推薦為OLTP資料庫和決策支援系統(decision support system,DSS)應用程式——如Oracle資料倉儲——使用不同的記憶體配置方案。OLTP系統應該將UNIX記憶體的大部分分配給SGA,而資料倉儲和DSS應用程式對記憶體較為敏感,則應分配大部分記憶體給PGA串連。
當然,如果一個資料庫會以兩種方式運作,你可以運行一個指令碼來動態改變記憶體配置。例如,如果一個資料庫在白天以OLTP模式運行,而在晚上以DSS模式運行,那麼你可以運行一個指令碼從SGA中拿些記憶體出來,重新分配到PGA地區。
alter system set sga_memory_max = 3g;
alter system set pga_aggregate_target = 3g;
在Oracle9i中,Oracle提供了增加或減少SGA記憶體以下部分大小的能力:
Data buffer size - alter system set db_cache_size=300m;
Shared pool size - alter system set shared_pool_size=200m;
Total PGA RAM memory size - alter system set pga_aggregate_target=2000m;
在UNIX上,Oracle通過修改UNIX記憶體區的物理地址空間來達到動態記憶體分配的目的。你在UNIX上用malloc()和free()命令就能做到。
新的動態SGA特性使得Oracle SGA可以以一個較小的容量開始,並根據需要逐漸增加。為了便利這個過程還提供了一個新的SGA_MAX_SIZE參數。