Oracle基礎知識--內存參數設置

 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

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