oracle9i 的記憶體分配

coolhe發表於2010-07-27

win2003;4G;oracle 9i -9.0.1.1
--記憶體分配
--1.5G
alter system set sga_max_size=1536M scope=spfile;
--40%
alter system set db_cache=600M scope=spfile;      
--10%
alter system set shared_pool_size=128M scope=spfile;
--
alter system set large_pool_size=48M scope=spfile;
=================
參考如下
=================
1.SGA區的大小
 
 SGA=log_buffer + Large_pool_size + java_pool_size + shared_pool_size + Data buffer
 SGA--原則:物理RAM的55%-58%;SGA不能太小,Oracle效能會差,但是也不能過大,影響作業系統正常運作。
 log_buffer--原則:128K-1M 之間,不可太大
 Large_pool_size--原則:若不使用MTS,5-10M 之間,不應該太大;若使用MTS,20-30M
 Java_pool_size--原則:假如資料庫沒有使用java,建議20-30M
 Shared_pool_size--原則:這個引數對效能影響很大,通常為物理RAM的10%
 Data buffer--原則:SGA中主要設定物件,一般為可用記憶體40%。資料緩衝區,這個引數對效能影響也很大,建議在確定了SGA的大小,和分配完前面的記憶體,剩下的都可
以分配給Data buffer。Oracle9i設定資料緩衝區的引數為:Db_cache_size
 
 Oracle 9i 具有動態SGA的功能,用作業系統命令檢視系統記憶體時,發現系統中還有空閒記憶體。 但為什麼有時使用oracle 9i 的sql  > alter system set
db_cache_size=xxxxM 命令時資料庫會報告錯 -- 沒有足夠的記憶體. 這是由作業系統引起的嗎?
 
 不是,原因在於此時SGA區中沒有多餘空閒記憶體。儘管系統中有空閒記憶體,但未分配給SGA 區。在oracle 9i 中 動態SGA的概念是無需經過關閉例項(instance), 修改初
始化引數檔案和重啟例項這一過程,就可動態調整 buffer cache 和 share pool 的大小。另外,動態SGA允許在例項執行時設定,下次啟動時將有多少實體記憶體分配給SGA
這一資料庫引數。SGA可用最大實體記憶體是由SGA_MAX_SIZE 引數來決定的。
 
 在啟動例項時,大小為SGA_MAX_SIZE 的記憶體就分配給了SGA,SGA成員(buffer cache, share pool等)根據引數值也會獲得相應的記憶體。
 
 例項啟動後SGA的各成員所用記憶體之和可以小於SGA_MAX_SIZE。資料庫管理員通過使用alter system命令來調整SGA成員間的記憶體分配。 當SGA中有足夠多的空閒記憶體時,
增大share pool 或 buffer cache 才能完成,否則會報記憶體不足。另外Share pool 和 buffer cache 的尺寸也可動態縮小。 當例項已啟動,SGA已達到 SGA_MAX_SIZE
值,可通過先減少某一成員的記憶體,再增加另一成員的記憶體來完成。
 
 SGA成員間是相互獨立的,在成員間分配記憶體時,其和一定不能大於 SGA_MAX_SIZE , 並且db_cache_size 引數不能等於0。
 
 在OLAP與OLTP混合型的應用環境中,利用動態SGA的功能,可以根據不同時刻應用的優先順序,來動態的調整buffer cache 和 share pool 的尺寸,以提高系統的效能 :
 
 a、當OLTP 應用 優先順序高時,縮小 buffer cache 的值,增大 share pool 的值;
 b、當 OLAP 應用優先順序高時,縮小 share pool 的值,增大buffer cache 的值
 
 2.PGA區的大小
 
 A、Sort_area_size  用於排序所佔記憶體
 B、Hash_area_size 用於雜湊聯接,點陣圖索引
 這兩個引數在非MTS下都是屬於PGA ,不屬於SGA,是為每個session單獨分配的,在我們的伺服器上除了OS + SGA,一定要考慮這兩部分
 原則:OS 使用記憶體+ SGA + session*(sort_area_size + hash_area_size + 2M)  < 總物理RAM 為好
 
 3.記憶體設定基本原則
 
 db_block_buffer 通常可以儘可能的大,shared_pool_size 要適度,log_buffer 通常大到幾百K到1M就差不多了
 
 4.如何使用大記憶體
 
 參考http://www.itpub.net/showthread.php?s=&threadid=124424&perpage=15&pagenumber=6http://www.itpub.net/356988.html
 
 1)首先要把windows 2000 advance server 的awe功能引數開啟,在boot.ini檔案裡新增 /PAE的引數以支援4G以上記憶體。
 2)把oracle升級到9.2.0.6,關於oracle打補丁的文件請參考補丁隨機文件按照文件作沒出現錯誤;
 3)在windows在登錄檔 _Local_Machine software-oracle-home0中新增一個二進位制值,名稱為AWE_WINDOW_MEMORY ,值的單位為位元組,我新增的是1G
 4)在oracle配置檔案裡修改引數:
 遮蔽db_cache_size引數,
 新增db_block_buffers=(A),A乘以db_block_size=你想要的db_cache_size
 新增USE_INDIRECT_DATA_BUFFERS=TRUE
 新增pre_page_sga = true
 新增_DB_BLOCK_LRU_LATCHES=64
 遮蔽sga_max引數(ORA-00385錯誤在存在sga_max時就出現,遮蔽之後就沒了)
 5)儲存。
 6)ok
 
 5. 記憶體有關的檢視
 
 --select * from v$sga_dynamic_components
 --select * from v$sga_dynamic_free_memory
 --select * from v$pgastat
 --select * from v$sga
 --select * from v$sgastat
 SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,
       1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS)) "Hit Ratio"
  FROM V$BUFFER_POOL_STATISTICS;
 
 6. buffer cache 調整建議
 
 SELECT size_for_estimate, buffers_for_estimate, estd_physical_read_factor, estd_physical_reads
    FROM V$DB_CACHE_ADVICE
    WHERE name          = 'DEFAULT'
      AND block_size    = (SELECT value FROM V$PARAMETER WHERE name = 'db_block_size')
      AND advice_status = 'ON';
 
 根據以上建議調整db_cache_size
 
 A common mistake is to continue increasing the buffer cache size. Such increases have no effect if you are doing full table scans or
operations that do not use the buffer cache
 
 7. 讓小表駐留記憶體(DB_KEEP_CACHE_SIZE 初始化引數)
 
 alter table t  storage(buffer_pool keep);
 
8.AWE_WINDOW_MEMORY實現故障解決
 
在Oracle8.1.7版本以下啟動資料庫的時候不用設定AWE_WINDOW_MEMORY的最小值,而在Oracle9.2.0的版本中則強制要設定AWE_WINDOW_MEMORY的最小值,這個最小值在
Oracle8.1.7中通過DB_BLOCK_LRU_LATCHES引數設定,在Oracle9.2.0中則通過_DB_BLOCK_LRU_LATCHES隱含引數設定,Oracle9.2.0的AWE_WINDOW_MEMORY的最小值由以
下的公式計算:
MIN(AWE_WINDOW_MEMORY)=(4096 * DB_BLOCK_SIZE * _DB_BLOCK_LRU_LATCHES)/8 
_DB_BLOCK_LRU_LATCHES = (Max buffer pools * SETS_PER_POOL) 
Max Buffer Pools是個常量,等於8,SETS_PER_POOL是個變數,它的大小由是否啟用VLM(即設定USE_INDIRECT_DATA_BUFFERS=TRUE引數)決定:
SETS_PER_POOL = 2* CPU_COUNT (啟用 VLM) 
SETS_PER_POOL= CPU Count /2 (不啟用VLM) 
例如:
CPU's = 16 
DB_BLOCK_SIZE = 8192 
Total RAM = 16 GB 
SETS_PER_POOL = 2 * CPU_COUNT = 32 
_DB_BLOCK_LRU_LATCHES = (max buffer Pools * sets_per_pool) = 8*32 = 256 MIN(AWE_WINDOW_MEMORY)=(4096*DB_BLOCK_SIZE*_DB_BLOCK_LRU_LATCHES)/8 =(
4096 * 8192 * 256) / 8 = 1073741824 bytes = 1024 MB 
這樣在Windows的登錄檔中的HKLM\Software\Oracle\Homex下的AWE_WINDOW_MEMORY值至少是1024M,否則就會提示錯誤:
ORA-27102 out of memory 
OSD-00034 Message 34 not found; Product=RDBMS;facility =SOSD 
O/S Error: (OS 8) Not enough storage is available to process this command 
 

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

相關文章