Oracle SGA是oracle的内存结构,存放着oracle通过oracle进程读写的内存数据。sga分为好多组件,比如shared pool,buffer cache,redo log buffer等等。shared pool又分为library cache,data dictionary cache.
library cache是存sql语句及其分析结果的内存结构
data dictionary cache是存放数据字典的内存结构
buffer cache存的就是数据。
我们分别来看这3部分如何判断其性能和调优:
1)library cache
用如下sql判断其性能:
select l.namespace,l.GETHITRATIO,l.PINHITRATIO,l.reloads,l.invalidations from v$librarycache l;
NAMESPACEGETHITRATIOPINHITRATIORELOADSINVALIDATIONS
1SQL AREA0.8290805731492060.975705036500957734995
2TABLE/PROCEDURE0.8292682926829270.95089283623608523210
3BODY0.9925385066353990.996592814899815450
4TRIGGER0.9763868065967020.987569551319995400
5INDEX0.510613207547170.757788161993769350
6CLUSTER0.9787234042553190.98562874251497100
7OBJECT1100
8PIPE1100
9JAVA SOURCE0.2666666666666670.33333333333333310
10JAVA RESOURCE0.2666666666666670.33333333333333310
11JAVA DATA1100
gethitratio是语法分析命中率,90%为好。
pinhitratio 是sql命中率,90%为好。
reloads因语法分析过期需要重新分析的次数,要小。
invalidations sql虽在,但已无效的次数,要小。
2)data dictionary cache
用如下sql判断其性能:
select 1-sum(getmisses)/sum(gets) from v$rowcache;
1-SUM(GETMISSES)/SUM(GETS)
0.970686883098906
这个值表示了数据字典内存命中率。这个数据在95%以上为好。
3)buffer cache
用如下sql判断其性能:
select 1 - ((physical.value - direct.value - lobs.value) / logical.value) "hitratio"
from v$sysstat physical,
v$sysstat direct,
v$sysstat lobs,
v$sysstat logical
where physical.name = 'physical reads'
and direct.name = 'physical reads direct'
and lobs.name = 'physical reads direct (lob)'
and logical.name = 'session logical reads';
10.87177594421064
注意(lob)前有个空格。
这时数据命中率,85%为好。在Oracle 10g中,这些项如果有问题都要调整sga_target参数。
alter system set sga_target=XXM scope=both;