記憶體最佳化:
SGA包括三個部分組成。資料緩衝區、日誌緩衝區及共用池
資料緩衝區:大小由DB_Cache_Size參數決定。select name,value from v$parameter where name in('db_cache_size','db_block_size','shared_pool_size','sort_area_size');
select name value from v$sysstat where name in ('db block gets','consistent gets','physical reads');
其中理想的情況:physical reads接近為0 也就是說資料全部來自資料緩衝區。
db block gets表示從記憶體讀取資料 consistent gets表示讀取一致性資料。
select child#,sleeps/gets ratio from v$latch_children where name ='cache buffers lru chain';
可以檢測到資料緩衝區是否有空閑,得到的空閑衝突比例應該接近0
資料緩衝區記憶體是否足夠大,效率如何,可以通過計算命中率來確定。用磁碟物理讀的資料與內在緩衝區的資料進行計算,就得出了命中率。一般要求在90%以上,否則必須增加資料緩衝區的大小。
共用池大小由參數shared_pool_size決定。在共用池裡,SQL區比資料緩衝消耗較大的記憶體地區。
select name ,bytes from v$sgastat order by name;
select * from v$sgastat where name = 'free memory';
free memory是空閑記憶體,是共用池中可以使用的位元組數,dictionary cache 是資料字典緩衝區,library cache是庫緩衝區,sql area是SQL緩衝區。
空閑百分比 = (空閑記憶體/共用池位元組數)×100% 如果小於20% 則應增大共用池參數Shared_Cache_size
排序區調整:
select name,value from v$sysstat wehre name like '%sort%"; sorts(memory)表示記憶體排序量, sorts(disk)表示磁碟序量。
失敗率 = sort(disks)/sorts(memory) ×100% 排序區的失敗率不得小於5%,否則必須增加排序sort_area_size的大小,使得Oracle盡量使用記憶體排序。
磁碟IO的調整就是把資料檔案放在多個不同的磁碟上。
減少了IO的操作次數就減少了CPU的需求。
下面是我一些實際操作的過程:
alter system db_cache_size=256000000 scope=spfile;
alter system open_cursors=800 scope=spfile;
alter system pga_aggregate_target=128000000 scope=spfile;
alter system sort_area_size=52428800 scope=spfile;
alter system sga_max_size=1024000000 scope=spfile;
alter system shared_pool_size=256000000 scope=spfile;
重啟一下Oracle就可以了。注意這裡配置的機器記憶體是4G。