oracle9i 的記憶體分配
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.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=6,http://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
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=6,http://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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript記憶體分配JavaScript記憶體
- JVM記憶體分配JVM記憶體
- java記憶體分配Java記憶體
- 垃圾收集器與記憶體分配策略_記憶體分配策略記憶體
- 記憶體分配的確定記憶體
- weblogic的記憶體分配Web記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- JVM 記憶體模型 記憶體分配,JVM鎖JVM記憶體模型
- 探索iOS記憶體分配iOS記憶體
- Java 記憶體分配策略Java記憶體
- java jvm 記憶體分配JavaJVM記憶體
- [C++]記憶體分配C++記憶體
- 動態記憶體分配記憶體
- 簡單理解動態記憶體分配和靜態記憶體分配的區別記憶體
- C語言的記憶體分配C語言記憶體
- 物件的建立與記憶體分配物件記憶體
- go是如何分配記憶體的?Go記憶體
- 控制C++的記憶體分配C++記憶體
- 記憶體分配的隱藏成本記憶體
- Oracle的記憶體分配和使用Oracle記憶體
- C中的記憶體分配模型記憶體模型
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- java基礎-記憶體分配Java記憶體
- C語言-記憶體分配C語言記憶體
- java-方法記憶體分配Java記憶體
- go記憶體分配器Go記憶體
- Java 堆疊記憶體分配Java記憶體
- 記憶體分配策略學習記憶體
- 記憶體分配方式 (轉)記憶體
- C語言-記憶體管理之一[記憶體分配]C語言記憶體
- Oracle9i的實體記憶體管理(轉)Oracle記憶體
- Go記憶體分配和GC的理解Go記憶體GC
- Oracle的記憶體的分配、回收[final]Oracle記憶體
- hadoop 記憶體分配規則Hadoop記憶體
- mimalloc記憶體分配程式碼分析記憶體
- 深度理解glibc記憶體分配記憶體
- 記憶體分配問題處理記憶體
- 【Java】 記憶體分配全面淺析Java記憶體