oracle中sga的合理设置,oracle学习:SGA_MAX_SIZE参数设置
oracle學習:SGA_MAX_SIZE參數設置
時間:2017-07-11 來源:
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
重啟實例
SQL> shutdown immediate
SQL> startup
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ---------------------------------
------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 300M
sga_target big integer 276M
只有重新啟動實例,設置才能生效。
但是現在兩個值出現不一致現象,哪一個規定了SGA的最大值呢?
SQL> select (sum(value))/1024/1024 "SIZE_MB" from v$sga;
size mb
----------
300
查看SGA分配規定的總和,已經是300m了,但是......
SQL> select sum(bytes)/1024/1024 "SIZE_MB" from v$sgastat;
SIZE_MB
----------
276.00251
v$sgastat看到的是內存當前分配的詳細信息,是sga_target的值
說明限制內存分配的參數還是由sga_target控制。
總結
以上是生活随笔為你收集整理的oracle中sga的合理设置,oracle学习:SGA_MAX_SIZE参数设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql naivcat执行存储过程_
- 下一篇: 奖学金c语言程序,奖学金 (C语言代码)