oracle版本:12.2,单实例,操作系统:rhel6.8
awr报告中Execute to Parse非常低,意味着SQL执行进行过程中进行解析比例比较高。
综合各方老师观点:
1、如果Soft Parse %和Execute to Parse %两个参数同时很低时,说明硬解析次数多,建议使用绑定变量。
本例中分别为0.12,100,不属于这种情况。
2、如果Soft Parse %高,而Execute to Parse %低时(<40%),说明执行解析比率低,可以通过静态sql、动态绑定、调整session_cached_cursor参数、调整open_cursor等方法来减少软解析。
本应用为Java开发的批处理程序,使用Druid作为数据源。
做了两个方面的变更:
1、修改session_cached_cursor参数
alter system set session_cached_cursors=100 scope=spfile;
重启数据库(shutdown immediate /startup)
2、开启客户端statement缓存:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)--><property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="100" /></bean>
再次观察发现有了明显改善,达到98%
相关SQL:
SELECT ‘session_cached_cursors‘ PARAMETER,LPAD(VALUE, 5) VALUE,DECODE(VALUE, 0, ‘ n/a‘, TO_CHAR(100 * USED / VALUE, ‘990‘) || ‘%‘) USAGEFROM (SELECT MAX(S.VALUE) USEDFROM V$STATNAME N, V$SESSTAT S,v$session cWHERE N.NAME = ‘session cursor cache count‘ AND s."SID"=c."SID" AND c."MACHINE"=‘KFPCServer-4‘ AND S.STATISTIC# = N.STATISTIC#),(SELECT VALUE FROM V$PARAMETER WHERE NAME = ‘session_cached_cursors‘)UNION ALLSELECT ‘open_cursors‘,LPAD(VALUE, 5),TO_CHAR(100 * USED / VALUE, ‘990‘) || ‘%‘FROM (SELECT MAX(SUM(S.VALUE)) USEDFROM V$STATNAME N, V$SESSTAT SWHERE N.NAME IN(‘opened cursors current‘, ‘session cursor cache count‘)AND S.STATISTIC# = N.STATISTIC#GROUP BY S.SID),(SELECT VALUE FROM V$PARAMETER WHERE NAME = ‘open_cursors‘);
注意:machine要改为客户端机器名称,避免由于plsql等客户端长时间连接影响统计准确性。
usage表示使用率,如果达到100%,则建议/需要增加该参数。