SGA_MAX_SIZE
SGA_MAX_SIZE這個參數顧名思義,它用來控制SGA 使用虛擬記憶體 的最大大小,這裡的虛擬記憶體的含 義可能會有所模糊,先可以這樣理解,就是Oracle 所能在記憶體中給SGA 分配的最大大小 。 現在來解 釋一下我這裡“虛擬記憶體”的含義,確切的應該這樣說:實際記憶體和虛擬記憶體。我們知道當 OS 中實際記憶體不夠使用的時候,OS 就會去使用虛擬記憶體。oracle 是運行與os 之上的一個系統軟體, 它也是一個程式,它所請求os 給它多少記憶體用來作為其sga (比方說Oracle 申請500M 記憶體用作SGA ,即SGA_MAX_SIZE=500M ),os 一般是不會在oracle 啟動的時候就給它全部的實際記憶體,而可能只給 200M 。
隨著程式的運行,Oracle 不斷的需要記憶體,而假設電腦的所有實際記憶體只有500M ,那麼很肯定 的是OS 不可能把全部500M 實際記憶體配置給oracle 的sga ,可能也最多就給了350M ,剩下的150M 使 用虛擬記憶體。Oracle 的SGA 達到500M 的時候(即達到SGA_MAX_SIZE 指定的大小),實際上這個sga 由350M 實際記憶體和150M 的虛擬記憶體組成,如果這個時候Oracle 想繼續申請記憶體給SGA 使用,那麼OS 是不會再給其分配記憶體,因為它已經達到了SGA_MAX_SIZE 的最大值。這個例子,雖然比較極端,即使 OS 實際上比方說有1G 記憶體,Oracle 的SGA 也未必全部由實際記憶體組成,可能是由400M 實際記憶體和 100M 的虛擬記憶體 組成,這是由作業系統的記憶體管理原則決定的。此時,很顯然有個問題,假設我的機 器實體記憶體(實際記憶體)足夠多,如何讓Oracle 所申請的SGA 記憶體全部在實體記憶體中呢,因為假設使 用了虛擬記憶體,必定會帶來額外的PAGE IN/PAGE OUT 的I/O 操作,這是很不合算的。這個問題其實就 是在實體記憶體中固定SGA 的問題,這要涉及到另外兩個參數LOCK_SGA 和PRE_PAGE_SGA 以及具體操作系 統是否支援記憶體鎖定的問題了,對此在這不予討論。
因此可以簡潔的這樣說:當執行個體啟動後,各個記憶體區只分配執行個體所需要的最小大小,在隨後的運行 過程中,再根據需要擴充他們的大小,而他們的總和大小受到了SGA_MAX_SIZE 的限制。
根據前面的SGA 的組成介紹,我們很容易得到一個計算SGA 的實際值的公式,如下:
SGA 實際大小 =
DB_CACHE_SIZE
+ DB_KEEP_CACHE_SIZE
+ DB_RECYCLE_CACHE_SIZE
+ DB_nk_CACHE_SIZE
+ SHARED_POOL_SIZE
+ LARGE_POOL_SIZE
+ JAVA_POOL_SIZE
+ STREAMS_POOL_SIZE (10g 中的新記憶體池)
+ LOG_BUFFERS+11K(Redo Log Buffer 的保護頁)
+ 1MB
+ 16M(SGA 內部記憶體消耗,適合於9i 及之前版本)
而SGA_MAX_SIZE 就是它的各個部分記憶體區都達到定義的最大值的時候的大小之和。修改 SGA_MAX_SIZE 的大小,必須要重新啟動資料庫執行個體。 這樣就可能出現這樣的一種情況,在spfile 中 ,SGA 各個記憶體區設定大小總和大於SGA_MAX_SIZE 。這時,oracle 會如下處理:當執行個體再次啟動時, 如果發現SGA各個記憶體總和大於SGA_MAX_SIZE,它會將SGA_MAX_SIZE 的值修改為SGA 各個記憶體區總和的 值。
SQL> show parameter sga;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 276M
sga_target big integer 276M
修改sga_max_size大小
SQL> alter system set sga_max_size=300m scope=spfile;
System altered.
修改後不會直接生效
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ --------------------------------- --------------- ---------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 276M
sga_target big integer 276M