内存优化:
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。