对于内存的调整,相对来说简单一些,我们首先可以针对数据缓冲区的大小来看。首先观察命中率
数据缓冲区命中率
SQL> select value from v$sysstat where name =''physical reads'';
VALUE
----------
14764
SQL> select value from v$sysstat where name =''physical reads direct'';
VALUE
----------
50
SQL> select value from v$sysstat where name =''physical reads direct (lob)'';
VALUE
----------
0
SQL> select value from v$sysstat where name =''consistent gets'';
VALUE
----------
167763
SQL> select value from v$sysstat where name = ''db block gets'';
VALUE
----------
14305
这里命中率的计算应该是
令 x = physical reads direct + physical reads direct (lob)
命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100
通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区
共享池的命中率
SQL> select sum(pinhits)/sum(pins)*100 "hit radio" from v$librarycache;
hit radio
----------
99.809291
假如共享池的命中率低于95%,就要考虑调整应用(通常是没使用bind var )或者增加内存
关于排序部分
SQL> select name,value from v$sysstat where name like ''%sort%'';
NAME VALUE
---------------------------------------------------------------- ----------
sorts (memory) 67935
sorts (disk) 1
sorts (rows) 7070
SQL>
假如我们发现sorts (disk)/ (sorts (memory)+ sorts (disk))的比例过高,则通常意味着sort_area_size部分内存较小,可考虑调整相应的参数。
关于log_buffer
SQL> select name,value from v$sysstat
2 where name in(''redo entries'',''redo buffer allocation retries'');
NAME VALUE
---------------------------------------------------------------- ----------
redo entries 2325719
redo buffer allocation retries 10
假如 redo buffer allocation retries/ redo entries 的比例超过1%我们就可以考虑增大log_buffer
通常来说,内存的调整的焦点就集中在这几个方面,更多更详细的内容,建议从statspack入手来一步一步调整。最后关于内存的调整,再强调这一点,一定要结合操作系统来衡量,任何理论都必须要实践来检验。在操作系统中观察 page in/out 状况,发现问题严重,应该考虑调小SGA。