此文主要是关于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%');