記憶體配置的最佳化

sembh發表於2010-07-11

應該讓有效資料長時駐留在記憶體結構中,這是oracle效能調整中非常重要的一個課題。

應該 啟用自動共享記憶體管理,把sga_target設定到一非零值,並把statistics_level設定為typical或者all。sga_target應該設定為作業系統記憶體總數中可以分配給oracle sga使用的記憶體量。sga_target受sga_max_size約束。sga_max_size定義了本機上oracle系統可以使用的最大sga。一般最大可達作業系統實體記憶體的70%.

*********sga記憶體分配原則(從aix角度出發)

1 減少頁交換操作

當需要支援其他應用執行時,會按照LRU演算法把當前駐留在記憶體中的資料頁Page out到物理磁碟,顯然,這會影響系統的執行效能。

所以一般在系統設計時,往往將資料庫安裝在一臺伺服器上,獨佔這臺伺服器的所有資源,避免頁交換的產生。

2 sga 應宿主在實體記憶體中

分配sga的目的就是為了快速將資料儲存在記憶體中。記憶體速度比硬碟速度至少快上4個數量級以上。所以如果sga對應的虛擬記憶體頁被交換到換頁空間(磁碟)上,那sga也就失去了意義。

3 為使用者連線準備充足的記憶體資源

除了sga外,還需要為在系統上執行的伺服器程式(pga)以及其他任務留下足夠的記憶體。

***********db cache問題

db cache總量是有限的,為了有效使用db cache,就必須限定使用db cache的操作總量。從開發的角度出發,就要在開發中儘量減少其編寫的SQL語句需要掃描的資料量,降低不必要的資料塊掃描。所以應該評估SQL的i/o代價,最佳化SQL語句以及PL/SQL,函式等物件。

在安裝配置oracle時,精確判定db cache的大小是不可能。正常的情況是,給出一個初始值,該值主要依賴於資料庫伺服器的記憶體總量以及能分配給oracle的部分。以後,應該經常性地跟蹤db cache的使用效率。具體方法是:使用v$db_cache_advice,以db cache使用命中率作為主要評價標準。

db cache的大小和物理I/O的關係是一條反函式,db cache為橫線,物理I/O為豎線,隨著db cache的變大,物理I/O會變小,當db cache大到某一個最優點以後,此時,物理I/O最小,再加大db cache已經不會再讓物理I/O減少。所以,盲目擴大資料庫快取沒有必要。

*******分析db cache命中率

db cache命中率是指所需資料在快取中被真到的機率。如果一條SQL操作訪問的資料快能夠在db cache中找到,則對應的物理I/O將會被避免。

需要三個統計引數consistent gets from cache一致性讀,db block gets from cache 快取讀,physical reads cache物理讀。這裡提供一個指令碼,用來判斷db cache命令率:

SQL>select name,value

from v$sysstat

where name in('db block gets from cache','consistent gets from cache','physical reads cache');

命中率:1-(物理讀)/(一致性讀+快取讀),這個命中率越高越好。但也不能完全掉進命中率的陷阱,不能因為命中率低就去增加db cache,或因為命中率高就去減少db cache。必須站在全域性的高度衡量問題。

*********增大資料快取的工作步驟:

1:db_cache_advice設定為on,並連續工作了一段時間。

2:查詢v$db_cache_advice,檢視增加資料快取導致I/O減少的比率,實現以價效比為依據。

3:判斷增加資料快取是否片面(增加以後,減少了作業系統記憶體使用,導致作業系統上的頁交換,則綜合結果為負)。

4:使用alter system命令增加資料塊快取尺寸。

SQL>alter system set db_cache_size=??M scope =both;(如果不成功,調整sga_target,sga_max_size)

******最佳化並不總是加大db_cache_size,在下面情況下需要縮小

1:db_cache總是保持較高的命中率,查詢v$db_cache_advice發現縮減db_cache並不會引起顯著的物理I/O增加。(反函式關係)

2:作業系統出現頻繁的頁交換(Page in/Out).

*********shared pool使用問題

從效能上看,應該儘可能實現軟解析,減少硬解析。做到這一點需要進行兩方面工作:能夠重用的SQL和PL/SQL,足夠尺寸的shared pool.

**************SQL和PL/SQL的重用:

1:開發SQL,PL/SQL時,要採用相同的程式設計規範,在程式中儘量避免使用動態SQL,儘量使用繫結變數,儘量採用儲存過程,函式或者包,包體。

2:避免在應用高峰時段執行表的DDL操作,因為這會導致依賴於表,索引的SQL必須做硬解析---他們多依賴的物件結構發生了變化。

3:對於序列物件,應該賦予其足夠的快取,這會減少資源鎖的使用頻率。

******shared pool 尺寸設定

一般而言,如果library cache,dictionary cache命中率低於90%,則考慮增加shared_pool_size的值。但同時要注意shard_pool_size的邊際效益。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24214296/viewspace-1035149/,如需轉載,請註明出處,否則將追究法律責任。

相關文章