前言
近來公司技術(shù),研發(fā)都在問我關(guān)于內(nèi)存參數(shù)如何設(shè)置可以優(yōu)化oracle的性能,所以抽時間整理了這篇文檔,以做參考.
目的
希望通過整理此文檔,使大家對oracle內(nèi)存結(jié)構(gòu)有一個全面的了解,并在實際的工作中靈活應(yīng)用,使oracle的內(nèi)存性能達到最優(yōu)配置,提升應(yīng)用程序反應(yīng)速度,并進行合理的內(nèi)存使用.
內(nèi)容
實例結(jié)構(gòu)
oracle實例=內(nèi)存結(jié)構(gòu)+進程結(jié)構(gòu)
oracle實例啟動的過程,其實就是oracle內(nèi)存參數(shù)設(shè)置的值加載到內(nèi)存中,并啟動相應(yīng)的后臺進程進行相關(guān)的服務(wù)過程。
進程結(jié)構(gòu)
oracle進程=服務(wù)器進程+用戶進程
幾個重要的后臺進程:
DBWR:數(shù)據(jù)寫入進程.
LGWR:日志寫入進程.
ARCH:歸檔進程.
CKPT:檢查點進程(日志切換;上一個檢查點之后,又超過了指定的時間;預(yù)定義的日志塊寫入磁盤;例程關(guān)閉,DBA強制產(chǎn)生,表空間offline)
LCKn(0-9):封鎖進程.
Dnnn:調(diào)度進程.
內(nèi)存結(jié)構(gòu)(我們重點講解的)
內(nèi)存結(jié)構(gòu)=SGA(系統(tǒng)全局區(qū))+PGA(程序全局區(qū))
SGA:是用于存儲數(shù)據(jù)庫信息的內(nèi)存區(qū),該信息為數(shù)據(jù)庫進程所共享。它包含Oracle 服務(wù)器的數(shù)據(jù)和控制信息,它是在Oracle服務(wù)器所駐留的計算機的實際內(nèi)存中得以分配,如果實際內(nèi)存不夠再往虛擬內(nèi)存中寫
我們重點就是設(shè)置SGA,理論上SGA可占OS系統(tǒng)物理內(nèi)存的1/2——1/3
原則:SGA+PGA+OS使用內(nèi)存<總物理RAM
SGA=((db_block_buffers*blocksize)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB
1、SGA系統(tǒng)全局區(qū).(包括以下五個區(qū))
A、數(shù)據(jù)緩沖區(qū):(db_block_buffers)存儲由磁盤數(shù)據(jù)文件讀入的數(shù)據(jù)。
大小: db_block_buffers*db_block_size
Oracle9i設(shè)置數(shù)據(jù)緩沖區(qū)為:Db_cache_size
原則:SGA中主要設(shè)置對象,一般為可用內(nèi)存40%。
B、共享池:(shared_pool_size):數(shù)據(jù)字典,sql緩沖,pl/sql語法分析.加大可提速度。
原則:SGA中主要設(shè)置對象,一般為可用內(nèi)存10%
C、日志緩沖區(qū):(log_buffer)存儲數(shù)據(jù)庫的修改信息.
原則:128K ---- 1M 之間,不應(yīng)該太大
D 、JAVA池(Java_pool_size)主要用于JAVA語言的開發(fā).
原則:若不使用java,原則上不能小于20M,給30M通常就夠了
E、 大池(Large_pool_size) 如果不設(shè)置MTS,主要用于數(shù)據(jù)庫備份恢復(fù)管理器RMAN。
原則:若不使用MTS,5---- 10M 之間,不應(yīng)該太大
SGA=. db_block_buffers*db_block_size+ shared_pool_size+ log_buffer+Java_pool+size+large_pool_size
原則: 達到可用內(nèi)存的55-58%就可以了.
2、PGA程序全局區(qū)
PGA:包含單個服務(wù)器進程或單個后臺進程的數(shù)據(jù)和控制信息,與幾個進程共享的SGA 正相反PGA 是只被一個進程使用的區(qū)域,PGA 在創(chuàng)建進程時分配在終止進程時回收.
A、Sort_area_size 用于排序所占內(nèi)存
B、Hash_area_size 用于散列聯(lián)接,位圖索引
這兩個參數(shù)在非MTS下都是屬于PGA ,不屬于SGA,是為每個session單獨分配的,在我們的服務(wù)器上除了OS + SGA,一定要考慮這兩部分
原則:OS 使用內(nèi)存+SGA+并發(fā)執(zhí)行進程數(shù)*(sort_area_size+hash_ara_size+2M) < 0.7*總內(nèi)存
實例配置
一:物理內(nèi)存多大
二:操作系統(tǒng)估計需要使用多少內(nèi)存
三:數(shù)據(jù)庫是使用文件系統(tǒng)還是裸設(shè)備
四:有多少并發(fā)連接
五:應(yīng)用是OLTP 類型還是OLAP 類型
基本掌握的原則是, db_block_buffer 通常可以盡可能的大,shared_pool_size 要適度,log_buffer 通常大到幾百K到1M就差不多了
A、如果512M RAM 單個CPU db_block_size 是8192 bytes
SGA=0.55*512M=280M左右
建議 shared_pool_size = 50M, db_block_buffer* db_block_size = 200M
具體: shared_pool_size =52428800 #50M
db_block_buffer=25600 #200M
log_buffer = 131072 # 128k (128K*CPU個數(shù))
large_pool_size=7864320 #7.5M
java_pool_size = 20971520 # 20 M
sort_area_size = 524288 # 512k (65k--2M)
sort_area_retained_size = 524288 # MTS 時 sort_area_retained_size = sort_area_size
B、如果1G RAM 單個CPU db_block_size 是8192 bytes
SGA=0.55*1024M=563M左右
建議 shared_pool_size = 100M , db_block_buffer* db_block_size = 400M
具體: shared_pool_size=104857600 #100M
db_block_buffer=51200 #400M
log_buffer = 131072 # 128k (128K*CPU個數(shù))
large_pool_size=15728640 #15M
java_pool_size = 20971520 # 20 M
sort_area_size = 524288 # 512k (65k--2M)
sort_area_retained_size = 524288 # MTS 時 sort_area_retained_size = sort_area_size
C、如果2G 單個CPU db_block_size 是8192 bytes
SGA=0.55*2048M=1126.4M左右
建議 shared_pool_size = 200M , db_block_buffer *db_block_size = 800M
具體: shared_pool_size=209715200 #200M
db_block_buffer=103192 #800M
log_buffer = 131072 # 128k (128K*CPU個數(shù))
large_pool_size= 31457280 #30M
java_pool_size = 20971520 # 20 M
sort_area_size = 524288 # 512k (65k--2M)
sort_area_retained_size = 524288 # MTS 時 sort_area_retained_size = sort_area_size
假定64 bit ORACLE
內(nèi)存4G
shared_pool_size = 200M , data buffer = 2.5G
內(nèi)存8G
shared_pool_size = 300M , data buffer = 5G
內(nèi)存 12G
shared_pool_size = 300M-----800M , data buffer = 8G
參數(shù)更改方式
oracle8i:
主要都是通過修改oracle啟動參數(shù)文件進行相關(guān)的配置
參數(shù)文件位置:
d:\oracle\admin\DB_Name\pfile\init.ora
按以上修改以上參數(shù)值即可。
Oracle9i:
兩種方式:第一種是修改oracle啟動參數(shù)文件后,通過此參數(shù)文件再創(chuàng)建服務(wù)器參數(shù)文件
第二種是直接運行oracle修改命令進行修改。
SQL>alter system set db_cache_size=200M scope=spfile;
SQL>alter system set shared_pool_size=50M scope=spfile;