關於oracle sga設置的總結

說明:
本總結不針對特例,僅對服務器只存在OS + ORACLE 爲例,如果存在其他應用請酌情考慮。寫這個也是因爲近來這種重複性的問題發生的太多所導致的。

首先不要迷信STSOCP SG以及某些專家給出的任何建議、內存百分比的說法。基本掌握的原則是:

l          data buffer 通常可以儘可能的大

l          shared_pool_size 要適度

l          log_buffer 通常大到幾百K1M就差不多了

設置之前,首先要明確2個問題
1
:除去OS和一些其他開銷,能給ORACLE使用的內存有多大?
2
Oracle64 bit 還是 32 bit 32bit 通常 SGA 1.7G 的限制(某些OS有特定處理或者WINDOWS上有特定設定可以支持到2G以上甚至達到3.7G,本人無這方面經驗)

下面是我的Windows2000下的Oracle :

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
PL/SQL Release 8.1.7.0.0 - Production
CORE 8.1.7.0.0 Production
TNS for 32-bit Windows: Version 8.1.7.0.0 - Production
NLSRTL Version 3.4.1.0.0 - Production

SQL>

windows
上存在32bit的限制,如AIXHP-UX 等有明確的64 bit OS ORACLE的版本,32 bit Oracle可以裝在64 bit OS 上,64 bit Oracle不能裝在32 bit OS上。

不管Oracle32 bit 還是 64 bit 的,假定應用存在沒有很好的使用bind var 的情況,也不能設置 shared_pool_size 過大,通常應該控制在100M--200M,除非是 ORACLE ERP 一類的使用了很多存儲過程函數、包 ,這樣的很大的系統,可以考慮增大shared_pool_size,但是如果超過500M可能是危險的,達到1G幾乎就會造成CPU的嚴重負擔,系統甚至癱瘓。所以shared_pool_size 如果超過200M還命中率不高,那麼應該從應用上找原因而不是一味的增加內存,shared_pool_size 過大主要增加了管理負擔和latch 的開銷。

log_buffer
128K -- 1M 之間通常問題不大,不應該太大。

large_pool_size
:如果不設置MTS,通常在 RMAN OPQ 會使用到,但是在10M --50M 應該差不多了。假如設置 MTS,則由於 UGA 放到large_pool_size 的緣故,這個時候依據 session最大數量和 sort_ares_size 等參數設置,必須增大large_pool_size 的設置,可以考慮爲 session * (sort_area_size + 2M)。這裏要提醒一點,不是必須使用MTS,我們都不主張使用MTS,尤其同時在線用戶數小於500的情況下。

java_pool_size :
若不使用java,給30M通常就夠了。

data buffer
:在做了前面的設置後,凡可以提供給Oracle的內存,都應該給data buffer = (db_block_size * db_block_buffers) 9i 中可以是 db_cache_size

還有2個重要參數我們需要注意:

sort_area_size
hash_area_size
這兩個參數在非MTS下都是屬於PGA ,不屬於SGA。它是爲每個session單獨分配的,在我們的服務器上除了OS + SGA,一定要考慮這兩部分。

(****) : OS
使用內存+ SGA + session*(sort_area_size + hash_area_size + 2M) < 總物理RAM 爲好

這樣歸結過來,假定Oracle 32 bit ,服務器RAM大於2G ,注意你的PGA的情況,則建議:

shared_pool_size + data buffer +large_pool_size + java_pool_size < 1.6G

再具體化,注意滿足上面(****) 的原則的基礎上可以參考如下設置:
如果512M RAM
建議 shared_pool_size = 50M, data buffer = 200M

如果1G RAM
shared_pool_size = 100M , data buffer = 500M


如果2G RAM
shared_pool_size = 150M ,data buffer = 1.2G


物理內存再大已經跟參數沒有關係了

舉例來說:
假定64 bit ORACLE

內存4G
shared_pool_size = 200M , data buffer = 2.5G

內存8G
shared_pool_size = 200M , data buffer = 5G

內存 12G
shared_pool_size = 300M , data buffer = 8G

總結

以上僅爲參考值,建議在設置參數的同時,init中使用 lock_sga ,在不同的平臺上可能有不同的方式,使得SGA鎖定在物理內存中而不被放入 SWAP 中,這樣對效率有好處。(關於內存的設置,要再進行細緻的調整,起的作用不大,但可根據statspack信息和v$system_event,v$sysstat,v$sesstat,v$latch 等視圖信息來考慮微調。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章