SGA內參數設置
2024-07-21 02:38:14
供稿:網友
Log_buffer 對于日志緩沖區的大小設置,通常我覺得沒有過多的建議,因為參考LGWR寫的觸發條件之后,我們會發現通常超過3M意義不是很大。作為一個正式系統,可能考慮先設置這部分為log_buffer=1—3M 大小,然后針對具體情況再調整。 Large_pool_size 對于大緩沖池的設置,假如不使用MTS,建議在20—30M 足夠了。這部分主要用來保存并行查詢時候的一些信息,還有就是RMAN在備份的時候可能會使用到。假如設置了MTS,則由于UGA部分要移入這里,則需要具體根據server PRocess數量和相關會話內存參數的設置來綜合考慮這部分大小的設置。 java_pool_size 假如數據庫沒有使用JAVA,我們通常認為保留10—20M大小足夠。事實上可以更少,甚至最少只需要32k,但具體跟安裝數據庫的時候的組件相關(比如http server)。 shared_pool_size 這是迄今為止最具有爭議的一部分內存設置。按照很多文檔的描述,這部分內容應該幾乎和數據緩沖區差不多大小。但實際上情況卻不是這樣的。首先我們要考究一個問題,那就是這部分內存的作用,它是為了緩存已經被解析過的SQL,而使其能被重用,不再解析。這樣做的原因是因為,對于一個新的SQL(shared_pool里面不存在已經解析的可用的相同的SQL),數據庫將執行硬解析,這是一個很消耗資源的過程。而若已經存在,則進行的僅僅是軟分析(在共享池中尋找相同SQL),這樣消耗的資源大大減少。所以我們期望能多共享一些SQL,并且假如該參數設置不夠大,經常會出現ora-04031錯誤,表示為了解析新的SQL,沒有可用的足夠大的連續空閑空間,這樣自然我們期望該參數能大一些。但是該參數的增大,卻也有負面的影響,因為需要維護共享的結構,內存的增大也會使得SQL的老化的代價更高,帶來大量的治理的開銷,所有這些可能會導致CPU的嚴重問題。 在一個充分使用綁定變量的比較大的系統中,shared_pool_size的開銷通常應該維持在300M以內。除非系統使用了大量的存儲過程、函數、包,比如Oracle erp這樣的應用,可能會達到500M甚至更高。于是我們假定一個1G內存的系統,可能考慮設置該參數為100M,2G的系統考慮設置為150M,8G的系統可以考慮設置為200—300M. 對于一個沒有充分使用或者沒有使用綁定變量系統,這可能給我們帶來一個嚴重的問題。所謂沒有使用bind var 的SQL,我們稱為Literal SQL.也就是比如這樣的兩句SQL我們認為是不同的SQL,需要進行2次硬解析: select * from EMP where name = ‘TOM’; select * from EMP where name = ‘JERRY’; 假如把‘TOM’ 和 ‘JERRY’ 換做變量V,那就是使用了bind var,我們可以認為是同樣的SQL從而能很好地共享。共享SQL本來就是shared_pool_size這部分內存存在的本意,oracle的目的也在于此,而我們不使用bind var就是違反了oracle的初衷,這樣將給我們的系統帶來嚴重的問題。當然,假如通過在操作系統監控,沒有發現嚴重的cpu問題,我們假如發現該共享池命中率不高可以適當的增加shred_pool_size.但是通常我們不主張這部分內存超過800M(非凡情況下可以更大)。 事實上,可能的話我們甚至要想辦法避免軟分析,這在不同的程序語言中實現方式有差異。我們也可能通過設置session_cached_cursors 參數來獲得幫助(這將增大PGA)。 Data buffer 現在我們來談數據緩沖區,在確定了SGA的大小并分配完了前面部分的內存后,其余的,都分配給這部分內存。通常,在答應的情況下,我們都嘗試使得這部分內存更大。這部分內存的作用主要是緩存 DB BLOCK,減少甚至避免從磁盤上獲取數據,在8i中是由db_block_buffers*db_block_size來決定大小的(包含default、keep、recycle)。假如我們設置了buffer_pool_keep 和buffer_pool_recycle,這兩部分內存的大小包含在前面設置中(db_block_buffers*db_block_size)。 buffer_pool_keep 是用來取代8i版本以前的緩存頻繁小表于LUR 的MOST USED端的。通過開辟一段獨立的內存用于緩存頻繁的小表,在創建表的時候可以指定存儲參數,或者也可以動態修改表的存儲參數(alter table t storage(buffer_pool keep);)。 Buffer_pool_recycle 作為一塊單獨開辟出來的內存,主要用于很少執行的大表全表掃描的查詢,使得這些大表掃描不會影響到default里面LRU而沖擊整個數據庫緩沖區的性能。雖然這樣有可能降低大表的全表掃描的性能,但是保護了整體性能不間歇性的受到較大的沖擊。同樣,除了設置參數外還需要在創建表的過程中使用存儲參數或者動態修改表的存儲參數(alter table t storage