日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle中sga的合理设置,oracle学习:SGA_MAX_SIZE参数设置

發布時間:2024/9/27 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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参数设置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。