此文主要是关于Oracle数据库调试和优化方面的相关内容的介绍,还有涉及到Oracle数据库中命里率的相关问题的解答,其中包括不同的算法之间性能的比对。以下就是相关内容的介绍。
关于Oracle中各个命中率的计算以及相关的调优
1)Library Cache的命中率:
计算公式:
LibraryCacheHitRatio=sum(pinhits)/sum(pins) SQL>SELECTSUM(pinhits)/sum(pins)FROMV$LIBRARYCACHE;
通常在98%以上,否则,需要要考虑加大共享池,绑定变量,修改cursor_sharing等参数。
2)计算共享池内存使用率:
SQL>SELECT(1-ROUND(BYTES/(&TSP_IN_M*1024*1024),2))*100||'%'FROMV$SGASTATWHERENAME='freememory'ANDPOOL='sharedpool';
其中: &TSP_IN_M是你的总的共享池的SIZE(M),共享池内存使用率,应该稳定在75%-90%间,太小浪费内存,太大则内存不足。
查询空闲的共享池内存:
SQL>SELECT*FROMV$SGASTATWHERENAME='freememory'ANDPOOL='sharedpool';
3)db buffer cache命中率:
计算公式:
Hitratio=1-[physicalreads/(blockgets+consistentgets)] SQL>SELECTNAME,PHYSICAL_READS,DB_BLOCK_GETS,CONSISTENT_GETS,1-(PHYSICAL_READS/(DB_BLOCK_GETS+CONSISTENT_GETS))"HitRatio"FROMV$BUFFER_POOL_STATISTICSWHERENAME='DEFAULT';
通常应在90%以上,否则,需要调整,加大DB_CACHE_SIZE,另外一种计算命中率的方法(摘自ORACLE官方文档<<Oracle数据库性能优化>>):命中率的计算公式为:
HitRatio=1-((physicalreads-physicalreadsdirect-physicalreadsdirect(lob))/(dbblockgets+consistentgets-physicalreadsdirect-physicalreadsdirect(lob))
分别代入上一查询中的结果值,就得出了Buffer cache的命中率
SQL>SELECTNAME,VALUEFROMV$SYSSTATWHERENAMEIN('sessionlogicalreads','physicalreads','physicalreadsdirect','physicalreadsdirect(lob)','dbblockgets','consistentgets');
4)数据缓冲区命中率:
SQL>selectvaluefromv$sysstatwherename='physicalreads';SQL>selectvaluefromv$sysstatwherename='physicalreadsdirect';SQL>selectvaluefromv$sysstatwherename='physicalreadsdirect(lob)';SQL>selectvaluefromv$sysstatwherename='consistentgets';SQL>selectvaluefromv$sysstatwherename='dbblockgets';
这里命中率的计算应该是令
x=physicalreadsdirect+physicalreadsdirect(lob)
命中率
=100-(physicalreads-x)/(consistentgets+dbblockgets-x)*100
通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区
5)共享池的命中率:
SQL>selectsum(pinhits-reloads)/sum(pins)*100"hitradio"fromv$librarycache;
假如共享池的命中率低于95%,就要考虑调整应用(通常是没使用bind var )或者增加内存
6)计算在内存中排序的比率:
SQL>SELECT*FROMv$sysstattWHERENAME='sorts(memory)';
—查询内存排序数
SQL>SELECT*FROMv$sysstattWHERENAME='sorts(disk)';
—查询磁盘排序数
--caculatesortinmemoryratioSQL>SELECTround(&sort_in_memory/(&sort_in_memory+&sort_in_disk),4)*100||'%'FROMdual;
此比率越大越好,太小整要考虑调整,加大PGA
7)PGA的命中率:
计算公式:BP x 100 / (BP + EBP)
BP: bytes processed
EBP: extra bytes read/written
SQL>SELECT*FROMV$PGASTATWHERENAME='cachehitpercentage';
或者从OEM的图形界面中查看,我们可以查看一个视图以获取Oracle的建议值:
SQL>SELECTround(PGA_TARGET_FOR_ESTIMATE/1024/1024)target_mb,ESTD_PGA_CACHE_HIT_PERCENTAGEcache_hit_perc,ESTD_OVERALLOC_COUNTFROMV$PGA_TARGET_ADVICE;Theoutputofthisquerymightlooklikethefollowing:TARGET_MBCACHE_HIT_PERCESTD_OVERALLOC_COUNT63233671252430250303375390500580600590700590800600900600
在此例中:PGA至少要分配375M,我个人认为PGA命中率不应该低于50%,以下的SQL统计sql语句执行在三种模式的次数:
optimalmemorysize,one-passmemorysize,multi-passmemorysize: SQL>SELECTnameprofile,cnt,decode(total,0,0,round(cnt*100/total,4))percentageFROM(SELECTname,valuecnt,(sum(value)over())totalFROMV$SYSSTATWHEREnamelike'workareaexec%');